2012-07-03 67 views
1

我只是在看這個例子從DeitelC:在使用指針時如何分配內存?

#include <stdio.h> 

struct card { 
    char *face; 
    char *suit; 
}; 

int main(void) 
{ 
    struct card aCard; 
    struct card *cardPtr; 
    aCard.face = "Aces"; 
    aCard.suit = "Spades"; 
    cardPtr = &aCard; 

    printf("%s%s%s\n%s%s%s\n%s%s%s\n", aCard.face, " of ", aCard.suit, 
     cardPtr->face, " of ", cardPtr->suit, 
     (*cardPtr).face, " of ", (*cardPtr).suit 
    ); 

    system("pause"); 
    return 0; 
} 

我看到有燒焦的指針,但從來沒有想過,你可以使用char *節省串...

的問題是:內存是如何處理在這裏,因爲我沒有看到任何東西像char word[50]

+1

請注意,現在將字符串文字分配給像這樣的char *類型的變量是個壞習慣。你應該改用'const char *'變量,因爲字符串文字不能在運行時修改(也不應該修改)。 –

回答

5

編譯器保留一些足夠大的內存位置來存儲文字並將其地址指定給指針。此後,您可以像使用正常的char *一樣使用它。一個警告是,你不能修改它指向的內存。

char *str = "This is the end"; 
printf("%s\n", str); 

str[5] = 0; /* Illegal. */ 

順便說一下,這個C FAQ也討論了這個問題。

+0

那麼,一旦完成它不能被修改? – JorgeeFG

+0

@Jorge這是非常多的,是的。 – cnicutar

+1

'undefined'比'Illegal'更準確。 –

1

字符串常量"Aces""Spades",,不只是編譯時文字。編譯器在(通常是隻讀的)程序存儲器中爲它們分配空間。

0

aCard.face =「Aces」; aCard.suit =「黑桃」; 取決於編譯器在哪裏保留字符串文字。如果在只讀段中,更改它將導致段錯誤,如果在可寫入的情況下,例如可以修改的堆棧段。所以行爲是不確定的!