Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 更新数组值时出现分段错误_C_Segmentation Fault - Fatal编程技术网

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

C 更新数组值时出现分段错误,c,segmentation-fault,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 ... } for(int i = 0; i < 11; i++) blah

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

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

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

在主函数中,我有一个for,其中我取0到9之间的值。

你传递的是什么值?如果大于9,则会出现分段错误


您应该调试它,并在将其传递到函数中时逐步检查i的值。此外,您的函数应该检查传入的i的任何值,以确保它在范围内,作为一般的良好实践,

您传入的i值是多少?如果大于9,则会出现分段错误


您应该调试它,并在将其传递到函数中时逐步检查i的值。此外,您的函数应该检查传入的i的任何值,以确保它在范围内,作为一般的良好实践,

您可能使用i>=10或<0作为参数调用bla。

您可能使用i>=10或<0作为参数调用bla。

检查i的值是什么。如果出于任何原因,它们最终达到10或更高,这就是seg故障的原因

检查的一个好方法是打电话:

printf("i: %d\n", i);
在废话的顶端

然后转到调用blah的地方,找出我最终是如何大于或等于10的。我猜你把它叫做for循环,而for循环的escape语句有点不对劲。中间的一个,更专业的术语正在逃离我。如果你这样称呼它:

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

  ...
}
for(int i = 0; i < 11; i++)
    blah(i);
for(int i = 0; i <= 10; i++)
    blah(i);
或者像这样:

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

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

这些都是错误的,并且是SEGFULT的原因。

检查i的值。如果出于任何原因,它们最终达到10或更高,这就是seg故障的原因

检查的一个好方法是打电话:

printf("i: %d\n", i);
在废话的顶端

然后转到调用blah的地方,找出我最终是如何大于或等于10的。我猜你把它叫做for循环,而for循环的escape语句有点不对劲。中间的一个,更专业的术语正在逃离我。如果你这样称呼它:

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

  ...
}
for(int i = 0; i < 11; i++)
    blah(i);
for(int i = 0; i <= 10; i++)
    blah(i);
或者像这样:

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

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

这些都是错误的,并且是SEGFULT的原因。

您可能需要在linux上尝试调试器。在windows上,尝试Visual Studio或任何其他具有内置调试的IDE。并跟踪错误。

您可能希望在linux上尝试调试器。在windows上,尝试Visual Studio或任何其他具有内置调试的IDE。并跟踪错误。

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

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

为什么不写呢?只是一个提示

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

然而,主要问题是因为变量“i”。传递给函数的“i”的值是多少?如果大于9,则意味着您正试图访问调用未定义行为的超出范围的数组

为什么不编写?只是一个提示

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

然而,主要问题是因为变量“i”。传递给函数的“i”的值是多少?如果它大于9,则意味着您试图访问调用未定义行为的超出范围的数组

我希望您确保只访问现有元素,也就是说,I在0..9的范围内?现在想不出任何其他内容。

我希望您确保只访问现有元素,也就是说,I在0..9的范围内?现在想不出其他任何东西。

显而易见的答案是你的索引i无效。你能发布更多的代码来说明我是如何计算的吗?显而易见的答案是你的索引i是无效的。你可以发布更多的代码来显示我是如何计算的吗?你怎么知道它是0到9?当i崩溃时,你有没有看到i的值是多少?你怎么知道它是0到9?您是否仔细查看了i在崩溃时的值?printf是所有段故障的原因;printf是所有段故障的原因;