Может быть, я проснулся слишком долго сегодня, но я не могу понять, почему это работает:
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);
}