0
#include<stdio.h>

typedef struct telephone
{
    char *name;
    int number;
} TELEPHONE;

int main()
{
    //TELEPHONE index;
    TELEPHONE *ptr_myindex;
    ptr_myindex = (TELEPHONE*)malloc(sizeof(TELEPHONE)); 
    //ptr_myindex = &index;

    ptr_myindex->name = "Jane Doe";
    ptr_myindex->number = 12345;
    printf("Name: %s\n", ptr_myindex->name);
    printf("Telephone number: %d\n", ptr_myindex->number);

    free(ptr_myindex);

    return 0;
}

これをコンパイルすると、ポインタを構造体に動的に割り当てず、代わりにコード内のコメントアウトされた部分を使用した場合と同じ結果が出力されます。なぜこれが起こるのですか?

4

2 に答える 2

3

宣言する場合:

TELEPHONE index

コンパイラは構造体の種類を認識しているTELEPHONEため、その構造体に必要なメモリを割り当てます。

例えば:

int a = 5;
int *p = &a;

パーフェクトだ。しかし、 なしで同じことを達成したい場合はint a = 5、次のようにする必要があります。

int *p;
p = (int*)malloc(sizeof(int));
*p = 5;

厳しい違いがあります。最初のコードは変数を に割り当てstack、2 番目のコードは に割り当てますheap。しかし、2 番目のケースでは、 の前に構造体にmalloc割り当てられたスペースはなく、割り当てられたスペースはポインター自体 (構造体自体と同じスペースを必要としない) だけです。

于 2012-09-22T16:29:01.200 に答える
2

コードの 2 つのバージョンは、次のことを行います。

  1. 構造体をヒープに割り当てます。
  2. 構造体をローカル変数として割り当てます。

これらのオプションは、このプログラムで交換可能です。構造体に代入して出力するコードは、構造体がヒープに割り当てられているかローカル変数であるかを気にしません。

于 2012-09-22T16:28:40.047 に答える