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

为何在C语言中使用单个变量而非数组会触发SIGSEGV错误?

为什么单变量版本的代码会触发SIGSEGV段错误?

问题场景

Chefland的天气报告判定为“良好”的条件是:一周内晴天的数量严格大于雨天数量。用数组实现的代码可以正常运行,但尝试用单个变量优化内存后,代码触发了SIGSEGV段错误,想知道问题出在哪。

可正常运行的数组版本代码

#include <stdio.h>
#define max 7
int main(void) {
    int T,Arr[max];
    scanf("%d",&T);
    while(T--)
    {
        int sun=0, rn=0;
        for(int i=0;i<max;++i)
        {
            scanf("%d",&Arr[i]);
            Arr[i]==0 ? ++rn : ++sun;
        }
        sun>rn?printf("Yes\n") : printf("No\n");
    }
    return 0;
}

触发SIGSEGV的单变量版本代码

#include <stdio.h>
#define max 7
int main(void) {
    int T,a;
    scanf("%d",&T);
    while(T--)
    {
        int sun=0, rn=0;
        for(int i=0;i<max;++i)
        {
            scanf("%d",a);
            a==0 ? ++rn : ++sun;
        }
        sun>rn?printf("Yes\n") : printf("No\n");
    }
    return 0;
}

错误原因分析

问题出在这一行:

scanf("%d",a);

scanf函数要求第二个参数必须是变量的内存地址(指针类型),这样它才能把读取到的输入值写入到对应变量的内存位置。但你直接传递了变量a的值——此时a未初始化,是一个随机的垃圾值,程序会把这个随机值当作内存地址去尝试写入数据,这属于非法内存访问,直接触发了SIGSEGV段错误。

修正后的单变量代码

只需要给a加上取地址符&,让scanf拿到正确的内存地址即可:

#include <stdio.h>
#define max 7
int main(void) {
    int T,a;
    scanf("%d",&T);
    while(T--)
    {
        int sun=0, rn=0;
        for(int i=0;i<max;++i)
        {
            scanf("%d",&a); // 这里加上&取地址符
            a==0 ? ++rn : ++sun;
        }
        sun>rn?printf("Yes\n") : printf("No\n");
    }
    return 0;
}

补充说明

你的思路完全正确:用单个变量循环存储输入值确实能节省内存(不需要维护长度为7的数组),但必须严格遵守scanf的参数规则——对于int这类基本数据类型的变量,必须通过&取地址符传递其内存地址给scanf。

内容的提问来源于stack exchange,提问作者dijkstra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:50:24