-1

このコードを書きましたが、出力は期待したものではありません。integer: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

4 に答える 4

3

ここ:for(g=1;g<=10;g++)と ここ:から始めてで終わるfor(i=1;i<=10;i++)必要があります。09for(i = 0; i < 10; i++)

にアクセスしようとするproj.verd[10][10][10]と、実際には配列境界外のメモリにアクセスしようとしています。これにより、未定義の動作が発生し、この場合は に書き換えproj.startPられました0

于 2013-02-12T08:08:27.137 に答える
1

配列の範囲外に出て、結果として値をゼロに設定したようです。1 から 10 ではなく 0 から 9 にすれば、うまくいくはずです。

于 2013-02-12T08:11:00.710 に答える
1

配列をオーバーフローさせ、undefined behaviorの領域に成功しました。この場合、構造体の他のメンバーを上書きしました。正しいコードは次のとおりです。

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 に答える
0

配列の境界の境界を超えると、コンパイラは割り当てられたスタックの他の部分の値を置き換えようとします。それがスタックの境界を越えると、セグメンテーション違反が発生します。ここでは、配列の境界を超えてアクセスしようとしたため、proj.startP に 0 を設定しています。

于 2013-02-12T09:22:34.957 に答える