【问题标题】:Assigning string to char* in structure将字符串分配给结构中的 char*
【发布时间】: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 的指针。
  • What is array decaying?的可能重复
  • @cniggeler 字符串文字是一个字符数组。当您在赋值中使用数组时,它会转换为指向数组中第一个元素的指针。因此,它自动成为指向存储字符串的内存的指针。如果你做了&"This is a string",那将是一个数组的地址(可能具有相同的值),但它是完全不同的东西。

标签: c string windows pointers


【解决方案1】:

分配的内存空间是从哪里来的?我不应该使用 malloc 吗?

您分配的字符串文字已经存在于内存中。与

char *foo = "bar";

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

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

因为字符串字面量是chars 的数组,(与任何数组一样)在大多数情况下都会衰减为指针。 Exceptions to array decaying into a pointer?

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 2015-09-25
    • 2011-09-23
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多