Проблема назначения строки компилятора Gcc - PullRequest
0 голосов
/ 04 июня 2011

Я написал этот код, потому что у меня похожая проблема в большой программе, которую я пишу. Насколько я знаю, проблема та же, поэтому я сделал небольшой пример.

#include <stdio.h>

typedef struct
{
    int x;
    char * val;
}my_struct;

int main()
{
    my_struct me = {4, " "};
    puts("Initialization works.");
    me.val[0] = 'a';
    puts("Assignment works.");
    puts(me.val);
    puts("Output works.");
    return 0;
}

При компиляции с tcc (Tiny C Compiler) он компилируется и выполняется нормально. Но, используя GCC 4.6.0 20110513 (предварительный выпуск), он компилируется, однако, когда я его выполняю, я получаю только «Инициализация работает». до того, как получить segfault.

Что я делаю не так? Это мой код или мой компилятор GCC?

Ответы [ 3 ]

8 голосов
/ 04 июня 2011

Ваш код. ANSI разрешает строковые константы только для чтения, и это поощряется, потому что это означает, что они могут быть общими для всей системы во всех запущенных экземплярах программы; gcc делает это, если вы не укажете -fwritable-strings, тогда как tcc делает их доступными для записи (вероятно, потому, что это проще).

0 голосов
/ 04 июня 2011

Как указали другие ответы, val указывает на строковую константу.Попробуйте

my_struct me = {4, malloc(2)};

и не забудьте проверить, является ли val NULL, если вы используете это в реальной программе.

0 голосов
/ 04 июня 2011

val - это точки, доступные только для чтения.

char *readOnly = "Data in read only location" ;

readOnly данные указания не могут быть изменены.

...