1

私は C で小さなプログラムを書きましたが、ベクトルのエラーが予想されました。

#include <stdlib.h>
#include <stdio.h>

main(){
       int vet[0];
       vet[0] = 1;
       vet[1] = 2;
       vet[2] = 2;
       vet[3] = 2;
       vet[4] = 2;
       vet[5] = 2;
       vet[6] = 2;
       vet[7] = 2;
       int x;
       for(x=0;x<19;x++) printf("%d\n", vet[x]);


       system("pause");
}

このコードを書く前に、ベクターに要素を追加するには、そのサイズに加えて、関数を呼び出す必要があると考えていましたが、malloc関数がなくてもmallocコードが正常に機能することを発見しました。だから私の質問は、この場合は役に立たないのに、なぜ malloc 関数を使用する必要があるのですか? また、ベクトルを初期化するときにベクトルの次元を記述する必要があるのはなぜですか?

4

4 に答える 4

5

割り当てたことのないメモリに書き込むことにより、未定義の動作が発生するためです。うまくいくこともあれば、うまくいかないこともあり、犬が爆発することもあります。

于 2013-08-16T12:51:34.043 に答える
3

次のように配列を定義する必要があります。

int vet [8];

そうしないと、メモリが割り当てられていないため、未定義の動作が発生します(プログラムの場合)vet
あとループも

for(x=0;x<19;x++)

範囲外になり、未定義の動作も引き起こします。したがって、それは

for(x=0;x<8;x++)

またmain定義をint main()またはに変更しますint main(void)

于 2013-08-16T12:52:44.473 に答える
3

それはかわいいですが、別の「ベクトル」を追加して、プログラムを少し変更しましょう。

#include <stdio.h>

int main(void){
       int vet[0];
       int vex[0];
       vet[0] = 1;
       vet[1] = 2;
       vet[2] = 2;
       vet[3] = 2;
       vex[0] = 3;
       vex[1] = 3;
       vex[2] = 3;
       vex[3] = 3;
       int x;
       for(x=0;x<4;x++) printf("%d\n", vet[x]);
}

プログラムが印刷することを期待できると思います1 2 2 2。私は実際に取得し1 3 2 3ます。あなたは何を得ますか?

「未定義の動作」を引き起こすものを使用すると、このような予期しないことが起こります。

于 2013-08-16T13:03:53.540 に答える
1

標準 C では、可変長配列であっても、サイズがゼロの配列は許可されません。未定義の動作です。そして、配列境界の外にアクセスしようとすると、別の未定義の動作になります。

別の言い方をすれば、ここではたまたま動作し、別のマシンでは動作しない可能性があります。

于 2013-08-16T12:52:06.263 に答える