C语言中两种字符数组初始化后printf输出异常的原因咨询
为什么两种字符数组初始化方式用printf输出结果不同?
这俩初始化方式的核心区别就在于字符串结束符'\0':
char a[] = "car";用双引号初始化字符串时,编译器会自动在数组末尾追加一个'\0'(ASCII值为0的字符),用来标记字符串的结束。所以a数组实际存储的是{'c','a','r','\0'},数组长度是4。char a[] = {'c','a','r'};这种逐个字符手动初始化的方式,编译器只会把你指定的三个字符存入数组,不会自动添加'\0',所以a数组长度是3,没有字符串结束标记。
再说说printf("%s", ...)的工作逻辑:它会从传入的内存地址开始,逐个输出字符,直到碰到'\0'才会停止输出。
第一种情况里,a数组末尾有'\0',所以printf输出到'r'就触发停止条件,只显示"car"。
第二种情况里,a数组没有'\0',printf就会越过a数组的边界,继续读取后续内存里的内容。因为栈上的局部变量通常是连续分配的,b数组刚好在a的后面,所以就把b的内容也一并输出了,直到碰到b数组自带的'\0'才停下。这种越界访问属于未定义行为,如果a后面的内存不是b,可能会输出乱码甚至导致程序崩溃。
内容的提问来源于stack exchange,提问作者hus
相关产品推荐
相关产品推荐

