8

假设以下代码:

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"但我上面的示例有效。编译器是否只是将该字符串存储在 Data 段中并指向它?换句话说,这就像做一个

struct c {
  char* name = "Ana";
};

谢谢。

4

2 回答 2

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

您没有在此处分配内存,因为您正在使指针c1.name指向字符串文字并且字符串文字具有静态存储持续时间。这不类似于:

char name[] = "Anna";

因为在这种情况下,分配内存来存储字符串文字,然后将字符串文字"Anna"复制数组name中。您对结构赋值c1.name = "Ana"的操作与您执行的操作类似:

char *name = "Anna";

即使指针指向字符串文字。

于 2013-07-10T18:45:37.787 回答
3

我是 C 的新手,但我认为这可能与

char *cThing;
cThing = "Things!";

然后将在哪里printf("%s\n", cThing);打印“Things!”,除非您在结构中声明指针。

于 2013-07-10T18:46:31.420 回答