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是所有段故障的原因;