2012-07-03 3 views
1

Я просто смотрю на этот пример из Deitel:C: Как назначается память при использовании указателей?

#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 = "Тузы"; aCard.suit = «Пики»; в зависимости от компилятора, где он хранит строковые литералы. Если в сегменте только для чтения изменение его приведет к ошибке сегментации, если в записи, например, сегменте стека, вы можете изменить. Таким образом, поведение не определено!

Смежные вопросы