【发布时间】:2018-10-21 02:59:10
【问题描述】:
也许我今天起床太久了,但我不知道为什么会这样:
int main() {
struct emf_struct {
long num;
char *str;
double real;
};
struct emf_struct emf [10];
emf[1].real= 4.5;
emf[1].str = "This is a string";
emf[1].num = 1234567890;
printf("%d-%s-%f\n", emf[1].num, emf[1].str, emf[1].real);
return(0);
}
在微软下编译(只是cl文件名),输出为:
1234567890-这是一个字符串-4.500000
如果该结构使用了字符数组,例如 char str[32],我可以理解它,但这是一个指向字符串的指针,它是一个简单的文字(没有地址)分配给该指针。
- 分配的内存空间从何而来?我不应该 不得不malloc?
- 没有它,作业不应该有 覆盖结构中str之后的实变量? (包装似乎没有效果。)
谢谢!
编辑:C 不是我的主要编程语言。人们提供的 cmets 和回复帮助我意识到了一些事情:文字具有由编译器维护的“地址”,我知道这对于初始化是正确的,但对于赋值却不是。我认为需要这样做:
int main() {
char *foo;
foo = (char *) malloc(17);
strcpy(foo, "This is a string");
printf("%s\n", foo);
return(0);
}
其实我只需要这样做:
int main() {
char *foo;
foo = "This is a string";
printf("%s\n", foo);
return(0);
}
【问题讨论】:
-
这是一个简单的文字赋值(没有地址)——这个假设是错误的。字符串文字也有与之关联的内存。
-
谢谢阿杰。所以我可以更好地理解,为什么它不必看起来像 emf[1].str = &"This is a string";?
-
"toto" 是一个静态存储数组,在这种情况下“衰减”为指向 char 的指针。
-
@cniggeler 字符串文字是一个字符数组。当您在赋值中使用数组时,它会转换为指向数组中第一个元素的指针。因此,它自动成为指向存储字符串的内存的指针。如果你做了
&"This is a string",那将是一个数组的地址(可能具有相同的值),但它是完全不同的东西。