假设以下代码:
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";
};
感谢。
答案 0 :(得分:8)
struct c c1;
c1.name = "Ana";
您没有在此处分配内存,因为您正在使指针c1.name
指向字符串文字,而字符串文字具有静态存储持续时间。这与以下内容不同:
char name[] = "Anna";
因为在这种情况下,内存被分配用于存储sting文字,然后字符串文字"Anna"
被复制到数组name
中。您使用结构分配c1.name = "Ana"
执行的操作与您执行的操作类似:
char *name = "Anna";
即。使指针指向字符串文字。
答案 1 :(得分:3)
我是C的新手,但我认为这可能和
一样char *cThing;
cThing = "Things!";
其中printf("%s\n", cThing);
将打印“Things!”,除非您在结构中声明指针。