C++笔试、面试、基础问题笔记

来源:互联网 发布:linux print 编辑:程序博客网 时间:2024/06/18 08:09

一、sizeof和strlen

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'/0'为止,然后返回计数器值。

1.

char* p = new char[100];//sizeof(p)的结果为4int* p = new int[100];//sizeof(p)的结果也为4


2.

char D1[23];//sizeof(D1)为23
int D2[23];//sizeof(D2)为92(23*4)

注意:sizeof()得到的分配的内存的字节数,和是否使用无关,例如,char a[8]={'a','b'},则sizeof(a)的值仍为8。

3.  

char ss[] = "0123456789";sizeof(ss) 结果 11 ===》ss是数组,计算到/0位置,因此是10+1
4.

char str0[8] = { 'a', 'b', 'c', 'd', 'e', 'f', 'i', 'g' };char str1[] = "abcdefig";
cout << strlen(str0) << endl;//因为没有 /0 结尾,所以strlen的返回不可知
cout << sizeof(str0) << endl;//结果为8

cout << strlen(str1) << endl;//结果为8
cout << sizeof(str1) << endl;//结果为9,会自动加/0结尾
由以上知,strlen计算的是实际值,而sizeof是实际值+1

int a[] = { 1,2 };
cout << sizeof(a) << endl;//结果为8
char str2[] = "01234/056789";char str3[] = "abcse/0fgkij";cout << strlen(str2) << endl;//结果为12cout << strlen(str3) << endl;//结果为12

总结:动态分配的数组不能用sizeof()来确定数组的字节大小。

二、menset()函数

函数原型是:void *memset(void *s, int ch, size_t n);

首先menset()是以字节为单位对初始化空间进行初始化的。所以说,对于char类型可初始化为任意值,而整形数组只能初始化为'\0'也就是NULL,ASCII码值为0.(数字 0的ASCII码值为48,A为65,a为97)。

memset(iBuf, 48, sizeof(char)* 10);  //ibuf为char类型,则把内存置为0

如下例子,

// 对整型数组进行初始化  int iBuf[10];memset(iBuf, 0, sizeof(int)* 10);  for (int i = 0; i < 10; ++i){cout<< iBuf[i];}
输出结果为 0000000000

// 对字符型数组进行初始化  char iBuf[10];memset(iBuf, 0, sizeof(char)* 10);  //for (int i = 0; i < 10; ++i){cout<< iBuf[i];}
输出结果为 空,若改为cout<<(int)iBuf[i];
则结果为 0000000000

// 对字符型数组进行初始化  char iBuf[10];memset(iBuf, 65, sizeof(char)* 10);  //for (int i = 0; i < 10; ++i){cout<< iBuf[i];}
输出结果为 AAAAAAAAAA 若改为cout<<(int)iBuf[i];
则结果为65656565656565656565

上面的例子之所以没有出错就是因为初始化为0(指ASCII码值为0,即NULL),但是如果初始化为1,那么因为int一般是4个字节,那么相当于将一个int元素初始化成了00000001 00000001 00000001 00000001,这样对于一个int元素肯定不是1,而是一个很大的数,结果出乎意料。

即当memset(, 0 ,)时,对于字符型置为NULL,对于整形则置为0。

原创粉丝点击