也许我今天起床时间太长了,但是我不知道为什么这样起作用:
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);
}
在Microsoft(仅cl文件名)下编译时,输出为:
1234567890-这是字符串-4.500000
如果该结构使用了字符数组(例如char str [32]),我可以理解,但这是指向字符串的指针,并且是指向该指针的文字(没有地址)的简单分配。
谢谢!
编辑:C不是我的主要编程语言。人们提供的评论和答复帮助我实现了一些东西:文字具有由编译器维护的“地址”,我知道对于初始化而不是对赋值来说是正确的。我认为需要这样做:
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);
}
答案 0 :(得分:3)
分配的存储空间从何而来?我不应该不得不分配吗?
您要分配的所有字符串文字常驻在内存中。与
char *foo = "bar";
您只需foo
指向该位置。指针实际上应该是char const*
,因为字符串文字是不可变的。
为什么不必看起来像
emf[1].str = &"This is a string";
?
因为字符串文字是char
的数组,它在大多数情况下(像任何数组一样)衰减为指针。 Exceptions to array decaying into a pointer?