在结构中将字符串分配给char *

时间:2018-10-21 02:59:10

标签: c string windows pointers

也许我今天起床时间太长了,但是我不知道为什么这样起作用:

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]),我可以理解,但这是指向字符串的指针,并且是指向该指针的文字(没有地址)的简单分配。

  • 分配的存储空间从哪里来?我不应该 不得不malloc?
  • 没有它,作业不应该有 覆盖结构体中str之后的实变量? (包装似乎没有效果。)

谢谢!


编辑: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);
}

1 个答案:

答案 0 :(得分:3)

  

分配的存储空间从何而来?我不应该不得不分配吗?

您要分配的所有字符串文字常驻在内存中。与

char *foo = "bar";

您只需foo指向该位置。指针实际上应该是char const*,因为字符串文字是不可变的。

  

为什么不必看起来像emf[1].str = &"This is a string";

因为字符串文字是char的数组,它在大多数情况下(像任何数组一样)衰减为指针。 Exceptions to array decaying into a pointer?