我已经编写了这段代码,但输出并不是我所期望的。我将整数:proj.startP
设置为1000
,但在执行了一些for循环后,变量再次设置为0
。
#include <stdio.h>
struct vezelstruct{
float verd[10][10][10];
int startP;
};
struct vezelstruct proj;
int main(int argc, char *argv[])
{
int g, i;
proj.startP=1000; // variable set to 1000
printf("%i\n", proj.startP);
for(g=1;g<=10;g++)
{
for(i=1;i<=10;i++){
proj.verd[g][10][i]=0.0;
}
}
printf("should be 1000: %i\n", proj.startP); // it's equal to 0 here
return 0;
}
我在这里做错了什么?
答案 0 :(得分:3)
在此处:for(g=1;g<=10;g++)
和此处:for(i=1;i<=10;i++)
您应该从0
开始,以9
结束,即for(i = 0; i < 10; i++)
。
当您尝试访问proj.verd[10][10][10]
时,实际上是在尝试访问数组边界外的内存。这会导致未定义的行为,在这种情况下导致将proj.startP
重写为0
。
答案 1 :(得分:1)
您已经溢出了数组并成功进入undefined behavior领域,在您的情况下已覆盖了结构的其他成员。正确的代码应该是:
for(g=0;g<10;g++)
{
for(i=0;i<10;i++){
proj.verd[g][9][i]=0.0;
}
}
答案 2 :(得分:1)
看起来你超出了数组的范围,结果将值设置为零。如果从0到9而不是从1到10,它应该可以工作。
答案 3 :(得分:0)
当您跨越数组边界的边界时,编译器会尝试替换分配给您的堆栈的其他部分中的值。如果它越过堆栈边界,则会出现分段错误。在这里,因为你试图访问多于数组边界,所以它在proj.startP中放置了0。