2012-09-22 107 views
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; 
} 

當我編譯這個時,它輸出的結果與我不動態分配指向結構的指針時相同,而是使用已被註釋掉的代碼中的部分。爲什麼會發生?在C中指向struct和malloc的指針?

+1

爲什麼你認爲你的結構對象的存儲時間會影響你的函數的行爲? – ouah

+3

我不確定你的意思是「爲什麼會發生這種情況」。你問爲什麼有可能有指向堆棧分配值的指針?如果是這樣,爲什麼不可能? – sepp2k

+1

這是功課嗎?認識它。 –

回答

3

當你聲明:

TELEPHONE index

編譯器知道什麼樣的結構TELEPHONE的是,所以它分配由結構所需的內存。

例如:

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

這是完美的。但是,如果我們要達到同樣沒有int a = 5,我們應做到以下幾點:

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

有強硬的差異。第一個代碼分配stack中的變量,而第二個代碼分配給heap。但在第二種情況下,在malloc之前沒有爲該結構分配空間,並且唯一分配的空間用於指針本身(不需要與結構本身相同的空間)。

2

你兩個代碼版本請執行下列操作:

  1. 在堆上分配的結構。
  2. 將結構分配爲局部變量。

這些選項在這個程序中是可以互換的。分配給結構然後打印的代碼並不關心結構是堆分配還是局部變量。

+0

這很有道理。謝謝=) – user1363410