次のコードスニペットは、64ビットのUbuntu 14.04で実行され、32ビットのUbuntu 14.04ではsegフォルトが実行されます。 gccのバージョンの両方4.8.4に同じで(Ubuntuの4.8.4-2ubuntu1〜14.04)32ビットと64ビットの動作の差
#include<stdio.h>
main()
{
int* a;
int* b;
*a = 40;
b=a;
printf ("%x ............. %p ...........%d \n",*a,a, *a);
}
2のいずれかが行われた場合、同じことが、32ビットシステム上で動作します - アウト
- コメントb = a
- * a = 40より前に
a=malloc (sizeof(int));
を追加します。
は、誰かがこの観測それは、64ビット対32ビットの問題ではありません
[tuple_catさんと@Weatherベーンのフィードバック@、Antの@統合することで編集]。あなたは 'a'に有効なメモリアドレスを割り当てていないので、ランダムなアドレスを持っています。ランダムなメモリに40の書き込みを割り当てて、何かが起こるようにするために参照解除します。 'malloc'はエラーを修正しますが、' free(a) 'を呼び出さなければメモリアドレスを持っています。 'a'を' b'に代入しても、この動作は変わりません。 –
コンパイラの警告を有効にします:*警告C4700:初期化されていないローカル変数 'a'が使用されました* –
** 2 **を追加しないと、未割り当てのメモリに書き込もうとしているため*未定義の動作*です。 ** 1 **はどこでも 'b'を使用していないので何も変更しません。 – Haris