2013-07-10 119 views
8

內存分配假設下面的代碼:C結構,指針和領域

struct c { 
    char* name; 
}; 

int main(int argc, char *argv[]) { 
    struct c c1; 
    c1.name = "Ana"; 
    printf ("%s\n",c1.name); 
    return 0; 
} 

我的第一反應會一直認爲我需要撥出一些空間,無論是在堆上,或通過顯式char name[] = "Anna" ,但我上面的例子工作。編譯器只是將該字符串存儲在數據段中並指向它?換句話說,是這樣做的嗎?

struct c { 
    char* name = "Ana"; 
}; 

謝謝。

回答

8
struct c c1; 
c1.name = "Ana"; 

你不必在這裏分配內存,因爲你正在指針c1.name指向一個字符串常量和字符串具有靜態存儲持續時間。這是不相似:

char name[] = "Anna"; 

因爲在這種情況下,內存被分配以存儲螫文字,然後將字符串文字"Anna"複製到陣列name。你與結構分配c1.name = "Ana"做的是類似的,當你做:

char *name = "Anna"; 

即使指針指向字符串文字。

+1

+1實際回答問題 –

+2

好吧,我想我明白了。澄清這一點的是你的「靜態存儲時間」,這意味着它實際上在編譯時在數據段中,然後編譯器明確地知道在哪裏指向。謝謝。 –

3

我是新的C但從我認爲這可能只是同

char *cThing; 
cThing = "Things!"; 

其中printf("%s\n", cThing);會然後打印「的東西!」,除非你在聲明一個結構的指針。

+1

我給你一個勝利點:)我覺得你有直覺,並用一個很好的簡單例子來傳達它,做得好 :) –