Допускает ли стандарт C99 запись в составные литералы (структуры)? Кажется, он не обеспечивает запись в буквальные строки. Я спрашиваю об этом, потому что в Программирование на C: современный подход, 2-е издание на Стр. 406.
В. Разрешение указателя на составной литерал делает возможным его изменение. Так ли это?
А. Да. Составные литералы - это значения l, которые можно изменять.
Но я не совсем понимаю, как это работает и как это работает со строковыми литералами, которые вы определенно не можете изменить.
char *foo = "foo bar";
struct bar { char *a; int g; };
struct bar *baz = &(struct bar){.a = "foo bar", .g = 5};
int main () {
// Segfaults
// (baz->a)[0] = 'X';
// printf( "%s", baz->a );
// Segfaults
// foo[0] = 'a';
// printf("%s", foo);
baz->g = 9;
printf("%d", baz->g);
return 0;
}
Вы можете видеть в моем списке вещей, которые segfault, запись в baz->a
вызывает segfault. Но запись в baz->g
- нет. Почему это один из них вызовет segfault, а не другой? Чем структурные литералы отличаются от строковых литералов? Почему структурные литералы также не помещаются в раздел памяти, доступный только для чтения, и определено ли поведение для обоих из них (вопрос стандарта)?