C语言对小型数组使用sizeof运算时出现Segmentation fault问题求助
问题根因
你的代码触发段错误的核心原因是对sizeof运算符的行为理解错误,以及由此引发的数组越界访问:
sizeof(数组名)的返回值是整个数组占用的总字节数,而非数组的元素个数。你定义的things是存储char*类型指针的数组,共3个元素,以常见的64位系统为例,单个指针占8字节,因此sizeof(things)的返回值是3 * 8 = 24,而非你预期的3。- 你的循环条件写为
i < sizeof(things) - 1,等价于i < 23,循环会执行23次:前3次i=0/1/2时,访问的是数组中合法的字符串指针,可以正常打印内容;从i=3开始就属于数组越界访问,读取的是数组后方未知内存的垃圾值,将这些无效值作为字符串地址传给printf后就会触发非法内存访问,也就是你遇到的打印完所有内容后才出现的段错误。
另外你的代码还存在两处不规范的写法:
- 遗漏了
#include <stdio.h>头文件,printf函数定义在该头文件中,缺失头文件在高版本C标准中属于未定义行为。 - 直接将字符串作为
printf的第一个参数存在安全风险,如果字符串中包含%格式控制符,会触发预期外的行为,建议明确指定格式字符串为%s。
修复方案
要获取数组的元素个数,需要用总字节数除以单个元素的字节数,即sizeof(things) / sizeof(things[0])。修复后的参考代码如下:
#include <stdio.h> int main() { char* things[] = {"test1\n", "test2\n", "test3\n"}; // 计算数组实际元素个数 size_t elem_cnt = sizeof(things) / sizeof(things[0]); for (size_t i = 0; i < elem_cnt; i++) { printf("%s", things[i]); } return 0; }
如果你确实不需要打印最后一个元素,将循环条件改为i < elem_cnt - 1即可。
内容的提问来源于stack exchange,提问作者user17066118
相关产品推荐
相关产品推荐

