1

我只是在看Deitel的这个例子:

#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 *...保存字符串

问题是:这里的内存是如何处理的,因为我没有看到任何类似char word[50].

4

3 回答 3

5

编译器保留一些足够大的内存位置来存储文字并将其地址分配给指针。此后,您可以像正常使用它一样使用它char *。一个警告是你不能修改它指向的内存。

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

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

顺便说一句,这个C FAQ也讨论了这个问题。

于 2012-07-03T19:54:12.067 回答
1

字符串常量"Aces","Spades"等不仅仅是编译时文字编译器在(通常是只读的)程序内存中为这些分配空间。

于 2012-07-03T19:56:53.643 回答
0

aCard.face = "王牌"; aCard.suit = "黑桃"; 取决于它保存字符串文字的编译器。如果在只读段中,更改它将导致分段错误,如果在可写例如堆栈段中,您可以修改。所以行为是不确定的!

于 2012-10-08T09:10:24.480 回答