2010-01-04 46 views
1

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

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 

    ... 
} 

在主函数中我有一个“为”我在其中取值为0〜9

+3

明显的答案是您的索引我无效。你能张贴更多的代码来显示我如何计算? – Naveen 2010-01-04 14:13:18

+1

那么解决方案是什么? – Constantin 2010-01-04 16:17:25

回答

7

你在传递什么样的价值观我的?如果它> 9,那么你会得到一个分段错误。

你应该对其进行调试,并通过当它传递到功能检查i的值步骤。此外,你的函数应该检查任何价值在我进去时,以确保它在范围内,作为一般的好习惯,

+0

我是从0到9 – Renee 2010-01-04 14:13:33

+0

也许'bla'被称为一些未初始化的'i'? – Heinzi 2010-01-04 14:14:53

+0

你怎么知道它是0到9?你有没有经历过,看到我崩溃时的价值? – 2010-01-04 14:15:37

1

你可能会调用与i >= 10(或< 0)BLA作为参数。

2

检查看看我的价值。如果他们出于任何原因结束了10或更高,那是导致seg故障的原因。

一个很好的方法来检查将是只要致电:

printf("i: %d\n", i); 

在嗒嗒的顶部。

然后转到blah被调用的位置,并计算出我是如何结束大于或等于10.我的猜测是你在for循环中调用它,并且for的循环语句有错误循环(中间一个,此时技术术语越逃离我)。如果你调用它像这样:

for(int i = 0; i < 11; i++) 
    blah(i); 

或者这样:

for(int i = 0; i <= 10; i++) 
    blah(i); 

那些是错的,段错误的原因。

+0

printf是导致所有段错误的原因。 ;) – 2010-01-04 17:20:47

1

你可能想尝试一个调试器,在Linux上尝试gdb。在Windows上,尝试使用Visual Studio或任何其他内置调试的IDE。并跟踪错误。

0

您可能正在修改只读向量。

1

你为什么不写?(只是一个提示)

int a[10]={0}; //Similar to what you have written 

但是主要的问题是,因为变量“i'.What是价值‘I’传递给你的函数?如果大于9则意味着您试图访问数组出界它调用的未定义行为

0

我希望你确信你只访问现有的元素,那就是,我是范围0..9?现在想不到任何其他的东西。