为何在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
相关产品推荐
相关产品推荐

