-1

我已经编写了这段代码,但输出不是我期望的那样。我将 integer: 设置proj.startP1000,但在做了一些 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

4 回答 4

3

这里:for(g=1;g<=10;g++)和这里:for(i=1;i<=10;i++)你应该从, 即开始0和结束。9for(i = 0; i < 10; i++)

当您尝试访问proj.verd[10][10][10]时,您实际上是在尝试访问数组边界之外的内存。这导致未定义的行为,在这种情况下导致重写proj.startP0.

于 2013-02-12T08:08:27.137 回答
1

您已经溢出了数组并成功进入了未定义行为的领域,在您的情况下,它已经覆盖了结构的其他成员。正确的代码应该是:

for(g=0;g<10;g++)
{
        for(i=0;i<10;i++){
                proj.verd[g][9][i]=0.0;
        }
}
于 2013-02-12T08:08:36.410 回答
1

看起来您超出了数组的范围并因此将值设置为零。如果你从 0 到 9 而不是从 1 到 10,它应该可以工作。

于 2013-02-12T08:11:00.710 回答
0

当您越过数组边界的限制时,编译器会尝试替换分配给您的堆栈的其他部分中的值。如果它越过堆栈的边界,那么你会得到一个分段错误。在这里,由于您尝试访问的不仅仅是数组边界,因此它在 proj.startP 中放置了 0。

于 2013-02-12T09:22:34.957 回答