sizeof结果是否取决于字符串声明?两种声明的结果差异原因解析
字符数组sizeof结果差异的原因
第一种声明方式(自动推导大小)
测试代码
int main() { unsigned char str[] = "abcde"; for(int j = 0; j <= 6; j++) { printf("str[%u]=%c; %i\n", j, *(str+j), *(str+j)); } printf("sizeof(str)=%lu\nstrlen(str)=%lu\n", sizeof(str), strlen(str)); return 0; }
运行结果
str[0]=a; 97 str[1]=b; 98 str[2]=c; 99 str[3]=d; 100 str[4]=e; 101 str[5]=; 0 str[6]=; 0 sizeof(str)=6 //here it is! strlen(str)=5
第二种声明方式(显式指定大小为5)
修改后的数组声明
unsigned char str[5] = "abcde";
运行结果
str[0]=a; 97 str[1]=b; 98 str[2]=c; 99 str[3]=d; 100 str[4]=e; 101 str[5]=; 0 str[6]; 8 sizeof(str)=5 // why 5 and not 6??? strlen(str)=5
差异原因解析
自动推导大小的情况:当用
[]不指定数组长度时,C编译器会根据初始化的字符串字面量自动分配空间——字符串里的5个字符加上字面量自带的\0终止符,总共6个字节。sizeof(str)计算的是数组实际占用的内存,所以返回6。显式指定大小的情况:你声明数组大小为5,编译器只会把字符串字面量的前5个字符(a到e)复制到数组中,没有多余空间存放
\0终止符。此时数组的有效元素只有索引0到4,str[5]属于越界访问,这个位置的0是内存中的随机值(只是这次刚好是0)。sizeof(str)只计算你声明的数组大小,也就是5个unsigned char的字节数,所以返回5。关于
strlen(str)返回5的巧合:strlen的逻辑是从起始位置找\0,直到找到为止。虽然数组内部没有\0,但刚好数组后面的内存位置有个0,所以strlen返回了5。这属于未定义行为,换个环境运行可能得到随机结果甚至崩溃。
内容的提问来源于stack exchange,提问作者Guille
相关产品推荐
相关产品推荐

