关于c字符数组的问题,请为小弟解开心中的疑惑

我想知道计算机是怎么用sizeof计算字符数组的长度的。
字符数组的结尾是 \0 如果初始化的字符串小于数组的长度则后面全是 \0
那么定义一个字符数组 char a[]="12345"的长度为6;char a[10]="12345的长度为10;我觉得在计算长度的时候遇到\0就该结束了,那为什么不是2个的长度都为6呢?所以我想知道计算机是怎么用sizeof计算字符数组的长度的。

char a[]="12345"是系统根据字符串的实际长度来为a设定长度,所以长度是6。
而char a[10]="12345“则是一开始就设定了数组长度为10,再往数组中初始化数据,不会改变数组本身的长度。
总之,在声明时指明了长度的数组,在sizeof时求得的就是指定的长度。声明时没有指定长度的,根据初始化数据列表的长度为确定数组实际长度。追问

我想知道的是计算机内部它怎么来获得长度,我定义了a[10];它是怎么知道就是10的;
计算机内部在 栈区里面会分配10个字节的内存存储字符,在静态区 会分配4个字节来存放a的首地址, 计算机在栈区读取字符的时候 遇到\0就知道结束了。那么我定义字符数组只有5个字符,而sizeof是怎么计算出他的长度为10的???

追答

sizeof是在编译阶段就计算好数据的大小的。编译器看见了a[10],当然知道他的长度是10啊。当[]中没有指明大小,那看到"12345"也就知道了长度是6了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-23
看了你的问题和追问,我来解开你的疑惑:
sizeof计算字符数组的长度时,就是一个依据,那就是看定义字符数组时在[]中写的是多少,写了n,计算出来就是n(实际上就没有计算,拿来就是了;整数等多字节元素数组时才有计算)。你可能不信,认为 char a[]="12345"的[]中没写啊!其实编译器在编译时已根据=后面的常量计算好给[]中填上数字了……定义数组的[]中不填数字实际是编译器语法而不是C/C++语法,编译过后数组的长度都是常量!
第2个回答  2011-12-04
数组变量的长度,如果是随机长度那么就定义为字符串的长度, 如果你预先定义了数组的大小,那么就是数组的长度.
相似回答