更新数组值时出现分段错误

时间:2010-01-04 14:10:32

标签: c segmentation-fault

我在写一个相当简单的程序时遇到了一个问题。我有一个静态分配的向量作为全局变量,在函数中我试图改变元素的值,这是程序停止并表示分段错误。代码是这样的:

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之间的值。

7 个答案:

答案 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范围内?现在想不出别的什么。