C:如何';使用指针时分配的内存是多少?

C:如何';使用指针时分配的内存是多少?,c,string,pointers,string-literals,playing-cards,C,String,Pointers,String Literals,Playing Cards,我只是从以下方面看这个例子: #包括 结构卡{ 字符*面; char*套装; }; 内部主(空) { 结构卡片; 结构卡*cardPtr; aCard.face=“Aces”; aCard.suit=“黑桃”; 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).脸,“of”,(*cardPtr).套装

我只是从以下方面看这个例子:

#包括
结构卡{
字符*面;
char*套装;
};
内部主(空)
{
结构卡片;
结构卡*cardPtr;
aCard.face=“Aces”;
aCard.suit=“黑桃”;
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).脸,“of”,(*cardPtr).套装
);
系统(“暂停”);
返回0;
}
我看到有一个指向char的指针,但从没想过可以使用
char*
保存字符串


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

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

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

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

顺便提一下,这也讨论了这个问题。

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

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

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

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

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

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

aCard.face=“Aces”;aCard.suit=“黑桃”; 取决于保存字符串文字的编译器。若在只读段中,更改它将导致分段错误,若在可写段(例如堆栈段)中,则可以修改。所以行为是未定义的

aCard.face=“Aces”;aCard.suit=“黑桃”;
取决于保存字符串文字的编译器。若在只读段中,更改它将导致分段错误,若在可写段(例如堆栈段)中,则可以修改。所以行为是未定义的

请注意,现在给
char*
类型的变量分配字符串文字是一种不好的做法,如下所示。您应该改为使用变量
const char*
,因为不能(也不应该)在运行时修改字符串文字。请注意,现在将字符串文字指定给类型为
char*
的变量是一种不好的做法。您应该改为使用变量
const char*
,因为字符串文字在运行时不能(也不应该)修改。@Jorge差不多就是这样,是的。
未定义的
非法的
更准确。谢谢,我已经测试过了:Excepción no controlada en 0x774315de en Test.exe:0xC0000005:Infracción de acceso al descripir en la ubicación 0x003d574d。我学到了一些新东西。@Jorge“一旦完成就不能修改?”——你的措辞暗示了一些混乱,因为这里没有“一旦完成”不能重做。无法修改字符串(指针指向的内存);指针可以是。@Jorge差不多就是这样,是的。
未定义
非法
更准确。谢谢,我已经测试过了:Excepción no controlada en 0x774315de en Test.exe:0xC0000005:Infracción de acceso al describir en la ubicación 0x003d574d。我学到了一些新东西。@Jorge“一旦完成就不能修改?”——你的措辞暗示了一些混乱,因为这里没有“一旦完成”不能重做。无法修改字符串(指针指向的内存);指针可以是。