You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:45:03