1

次のCコードを検討してください-

typedef struct node
{
    int data;
}node;

int main()
{
    node *temp;
    temp->data=100;
    printf("%d",temp->data);
    return 0;
}

(私が思うに)メモリを割り当てていないためSegmentation fault、オンラインで表示されます。temp->data=100;ですから、などはありませんtemp->data
しかし、私が試してみると -

int main()
{
    node *temp,*n;
    n=(node*)malloc(sizeof(node));
    n->data=100;
    temp->data=n->data;
    printf("%d",temp->data);
    retrun 0;
}

適切な出力100が得られます。ポイントするメモリを割り当てていませんtemp。しかし、まだコピーn->dataしていtemp->dataます。どのように ??

4

5 に答える 5

1

幸運ですね。

ローカル変数は自動的に初期化されないため、プログラムが開始されると、 と の両方tempに、nたまたまスタックにある値が含まれます。次に、メモリが割り当てられ、nそれを指すように設定されます。値 100 がdata構造体のメンバーに格納されます。

しかしtemp、まだ初期化されていないため、値 100 がメモリの指定されていない領域にコピーされます。そのメモリがたまたまどこにあるかによって、プログラムがセグメンテーション違反を起こしたり、所有していないメモリを単に破損したりする可能性があります。

于 2012-10-08T22:51:07.923 に答える
1

最初のコードも正しく、「temp」はガベージ値を指しているため、それを初期化する必要があります。

temp=(node *)malloc(sizeof(node));
于 2014-01-10T18:25:02.890 に答える
1

セグメンテーション違反がないのはtemp->data=n->data;偶然です。tempは初期化されていないため、デジタル ニルヴァーナを指しています。

を呼び出すと、バイトmallocが割り当てられsizeof node(実際にはもう少し多くなる場合があります)、 が指すブロックへのフル メモリ アクセスが可能になりますn

一般に、次のように呼び出す必要がありますmalloc

node *n;
n = malloc(sizeof *n);
  1. キャストなし
  2. sizeof *n代わりにsizeof <datatype>。データ型を変更した場合(たとえば、タイプミスがあり、代わりにtypedef .... nodentypedef ... nhodeを記述した場合。変数の宣言を変更するだけでよく、残りのコードはまったく変更する必要はありません。
于 2012-10-08T22:52:21.210 に答える
0

node* temp がどこも指していないため (まあ、どこかですが、割り当てられたメモリを指していないため)、最初の部分ではセグメンテーション違反が発生します。

2番目のものが「機能する」理由がわかりません。クラッシュしていないという点で、機能しているように見えるだけだと思います。しかし、一時は初期化されていないため、その「100」がどこに固執しているかは誰にもわかりません。たぶん、後でクラッシュするためにぶらぶらしているだけです。いずれにせよ、初期化されたメモリへの書き込みは良い考えではありません;-0

于 2012-10-08T22:49:21.807 に答える