strlen是一个函数,用来计算字符串的长度。
#include <string.h>
size_t strlen(const char *s);
char test[4] = {'t','e','s','t'};
此时strlen(test)的结果是什么?
答案是无法预知。
因为字符串"test"没有以字符'\0'结束,
而字符't'后面的地址上的数据是无法预知的,
并且strlen计算字符串的长度是以'\0'作为结束标志的。
这时strlen的结果就是非预期的,从而导致程序出错。
所以,必须在做字符串操作时必须很有意识的在尾处补'\0'字符。
char* p;
此时strlen(p)的结果是什么?
结果同样是不可预测的。
因为指针变量p没有被初始化,所以p的值是未知的。
所以p指向的存储器位置所对应的值也是未知的。
所以,变量特别是局部变量声明时必须有意识的去进行初始化。
sizeof是一个运算符,用来计算变量或一个结构的长度。
对sizeof运算符而言,无论变量是否初始化其结果都是一致的。
char test[4];
无论字符串test是否被初始化,sizeof(test)的值总是4。
char *p;
sizeof(p)的结果为4;
char *p = malloc(10);
sizeof(p)的结果还是为4。
无论指针p是否被初始化,对于sizeof运算符而言,p只是一个指针变量。
而任何类型的指针变量,都是占用4个字节。
这是因为指针即地址,对于32位操作系统而言,其虚拟地址范围达到4Gb,
4个字节正好可以指向4Gb地址的任何位置。
所以指针变量的大小也就是4字节了。
那对于64位操作系统,指针变量应该会占用8个字节?