2013-02-12 61 views
-1

我写了这段代码,但输出结果并不是我所期望的。我将整数: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; 
} 

我在做什么错在这里?

+4

索引从0开始!!! – nhahtdh 2013-02-12 08:05:03

回答

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.startP0

+0

写出来的习惯写法是“我<10”,而不是“我<= 9”。没有理由让代码更难阅读。 – Art 2013-02-12 08:13:08

+0

@艺术:你是对的。我只想在这里强调数字'9'。 – LihO 2013-02-12 08:14:31

+0

奥克,thanx很多! – 2013-02-12 08:18:27

1

你已经飞越你的数组,并成功进入undefined behavior的领域,在你的情况下,它已经覆盖了结构的其他成员。正确的代码应该是:

for(g=0;g<10;g++) 
{ 
     for(i=0;i<10;i++){ 
       proj.verd[g][9][i]=0.0; 
     } 
} 
1

看起来像你超出了你的数组边界并将值设置为零。如果你从0到9而不是1到10,它应该工作。

0

当您跨越数组边界的限制时,编译器会尝试替换分配给您的堆栈的其他部分中的值。如果它跨越栈的边界,那么你会遇到分段错误。这里因为你试图访问比数组边界更多的数据,所以它把0放在proj.startP中。

+0

如果您添加报价以支持您的答案,情况会更好 – yuan 2013-02-12 13:37:18