【发布时间】:2014-09-27 15:52:23
【问题描述】:
我试图理解 C 编程中的指针和字符数组。 我有一个名为 player 的结构,定义如下:
typedef struct player{
char* name;
float ppm;
} player;
我在 Main 中有以下内容:
int main()
{
player* head = (player*) malloc(sizeof(player));
char* meName = &(head->name);
(*head).name = "potato";
(*head).name = "Paul";
(*head).ppg =7.6;
//printf("player is named %s\n", *meName); //First print
printf("player is named %s\n", meName); //second print
printf("player is named %s\n", (*head).name); //third print
return 0;
}
为什么我的第一个打印会导致分段错误,为什么我的其他两个打印会输出以下内容:
player is named k0@
player is named Paul
如果我没记错的话meName 应该指向一个内存地址,然后通过使用另一个指向同一内存地址的指针来更改该地址。事实上,如果我像第二次打印一样打印它,它会显示该地址。当我清楚地将变量设置为指向之后立即更改的内存空间时,为什么取消引用它会导致segFault?为什么不改成Paul?为什么它首先会引发段错误?
另外,我希望能解释一下箭头 -> 与用于取消引用指针的 *。
【问题讨论】:
-
Don't cast the result of malloc (and friends)。此外,
(*head).name等价于更好的head->name。这个表达式中的括号很杂乱:&(head->name)。不管怎样,meName的类型是char*,而不是char**。我的建议:编译带有完整警告的代码,并注意它们。