sizeof是返回变量声明后所占的内存数。
对于一个指针而言,声明后,指针本身所占的内存就是4个字节,而声明一个数组的时候就创建了一个数组大小的内存。
如:char *s = "dfsdfsd"; char ss[] = "asdf"; int a[10];int *aa;
sizeof(s) = 4; s是个指针,指针声明后的地址为4个自己,而这个地址里面存的是后面字符转的地址名。
sizeof(ss) = 5; 数组在声明后大小就确定了
sizeof(a) = sizeof(int )*10=40;
sizeof(aa) = 4;
strlen的参数只能是char*或者char数组 且必须是以“\0”结尾,内部实现是用一个循环计算到\0之前为止
当传递一个数组名到函数参数时候。它完全退化成一个指针:
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\\\\\\\\0为止之前
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char*或者char数组 且必须是以“\0”结尾
其实理解
sizeof
只需要抓住一个要点:栈
程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针来间接操作的。
sizeof
操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。
char const * static_string = "Hello";
sizeof(static_string) 是
sizeof 一个指针,所以在 32bit system 是 4
char stack_string[] = "Hello";
sizeof(stack_string) 是
sizeof 一个数组,所以是
6 * sizeof(char)
char * string = new char[6];
strncpy(string,"Hello",6");
sizeof(string)
是
sizeof
一个指针,所以还是 4。和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。
不管指针指向的内容在什么地方,
sizeof
得到的都是指针变量本身的大小