C语言中的结构体、指针和内存分配。

9
假设有以下代码:
struct c {
  char* name;
};

int main(int argc, char *argv[]) {
  struct c c1;
  c1.name = "Ana";
  printf ("%s\n",c1.name);
  return 0;
}

我的第一反应是认为我需要分配一些空间,可以在堆上分配,也可以通过显式的char name[] = "Anna"来分配,但是我上面的例子可以工作。编译器只是将该字符串存储在数据段中并指向它吗?换句话说,这就像做了一个

struct c {
  char* name = "Ana";
};
2个回答

9
struct c c1;
c1.name = "Ana";

您不需要在这里分配内存,因为您正在使指针c1.name指向一个字符串字面值,而字符串字面值具有静态存储期。这与以下情况不相似

char name[] = "Anna";

因为在这种情况下,内存被分配用于存储字符串字面量,然后将字符串字面量"Anna"复制到数组name中。当您执行结构体赋值c1.name = "Ana"时,类似于以下操作:
char *name = "Anna";

即使指针指向一个字符串字面值。

2
好的,我想我明白了。澄清这一点的是你所说的“静态存储期”,这意味着它实际上在编译时位于数据段中,然后编译器显然知道指向哪里。谢谢。 - Dervin Thunk
请注意,char name[] = "Anna"; 只能用于初始化,而不能在后面进行赋值。struct a { char b[10]; }; 不需要手动分配 b 字段的内存,但也不允许使用 struct a c; c.b = "Anna";。相反,您需要使用 strcpystrncpystrcat 等函数。 - Chris

3

我刚刚开始学习C语言,但我认为这可能与……一样。

char *cThing;
cThing = "Things!";

如果你在结构体中声明了指针,那么printf("%s\n", cThing);会打印出"Things!"。


1
我给你一个胜利点 :) 我觉得你的直觉很棒,而且用了一个好的简单例子来传达它。干得好 :) - Dervin Thunk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接