Назначение строки в char * в структуре - PullRequest
0 голосов
/ 21 октября 2018

Может быть, я проснулся слишком долго сегодня, но я не могу понять, почему это работает:

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 голосов
/ 21 октября 2018

Откуда появилось пространство памяти для назначения?Разве я не должен был malloc?

Строковый литерал, который вы назначаете, уже находится в памяти.С

char *foo = "bar";

вы просто указываете foo на это место.Указатель должен быть действительно char const*, хотя строковые литералы неизменны.

Почему бы не выглядеть, emf[1].str = &"This is a string";?

Поскольку строкалитерал - это массив char с, который (как и любой другой массив) распадается на указатель при большинстве условий. Исключения для массива, распадающегося на указатель?

...