C语言中为何空数组的字符串长度与数组大小存在差异?
关于未初始化字符数组的strlen与sizeof差异的解答
嘿,这两个问题本质上是同一个核心知识点的不同问法,咱们来拆解清楚:
先搞懂sizeof和strlen的本质区别
sizeof是编译期运算符:它的作用是计算你声明的变量/类型在内存中占据的总字节数,这个值在编译的时候就已经确定了,和变量里实际存的内容完全无关。比如你声明了char b[7],每个char类型占1字节,7个元素就是7字节,所以sizeof(b)必然返回7,不管数组里有没有填内容。strlen是运行期库函数:它的工作逻辑是从传入的指针位置开始,逐个字节扫描,直到碰到第一个'\0'(字符串终止符)才停止,返回的是扫描过的字节数(不包含'\0'本身)。它只认'\0',不管你声明的数组有多大。
为什么你的示例里结果差异这么大?
你代码里的char b[7];是未初始化的字符数组,数组里的每个元素都是内存里的随机垃圾值,根本没有预设的'\0'终止符。这时候strlen(b)会一直往数组外面的内存空间读,直到在某个碰巧的位置遇到'\0',所以返回22这种奇怪的数字完全是随机的——甚至可能因为越界访问导致程序崩溃,这在C语言里属于未定义行为,结果是不可预测的。
顺便纠正一个小误解:你说的“空数组”其实不准确,char b[7]是一个大小固定为7的数组,只是没有初始化内容;如果是空字符串(""),里面会自动包含一个'\0',这时候strlen("")返回0,sizeof("")返回1(因为包含那个终止符)。
内容的提问来源于stack exchange,提问作者ソフトウェア開発者
相关产品推荐
相关产品推荐

