我在写一个相当简单的程序时遇到了一个问题。我有一个静态分配的向量作为全局变量,在函数中我试图改变元素的值,这是程序停止并表示分段错误。代码是这样的:
int a[10] = {0,0,0,0,0,0,0,0,0,0};
...
int bla(int i){
...
a[i] = a[i] + i%3; //segmentation fault at this line
...
}
在main函数中,我有一个“for”,其中i取0到9之间的值。
答案 0 :(得分:7)
你传递的是什么价值?如果是> 9然后你会得到一个分段错误。
你应该调试它,并在传递给函数时逐步检查i的值。此外,您的函数应该检查传入的任何值以确保它在范围内,作为一般的良好实践,
答案 1 :(得分:2)
检查i的值是什么。如果由于某种原因它们最终达到10或更高,那就是seg故障的原因。
检查的好方法是打电话:
printf("i: %d\n", i);
在最糟糕的时候。
然后转到调用blah的地方并弄清楚我是如何结束大于或等于10.我的猜测是你在for循环中调用它并且for循环的escape语句有问题(中间的一个,更具技术性的术语现在正在逃避我)。如果你这样称呼它:
for(int i = 0; i < 11; i++)
blah(i);
或者像这样:
for(int i = 0; i <= 10; i++)
blah(i);
这些是错误的,也是段错误的原因。
答案 2 :(得分:1)
你可能用i >= 10
(或&lt; 0)作为参数调用bla。
答案 3 :(得分:1)
你可能想尝试一下调试器,在linux上尝试gdb。在Windows上,尝试Visual Studio或任何其他内置调试的IDE。并跟踪错误。
答案 4 :(得分:1)
你为什么不写?(只是小费)
int a[10]={0}; //Similar to what you have written
然而,主要的问题是因为变量'i'。'i'传递给你的函数的价值是什么?如果它大于9则表示您正在尝试访问数组越界,这会调用未定义的行为
答案 5 :(得分:0)
您可能正在修改只读矢量。
答案 6 :(得分:0)
我希望您确保只访问现有元素,即我在0..9范围内?现在想不出别的什么。