Ошибка сегментации при использовании strupr (...) с компилятором GCC - PullRequest
1 голос
/ 20 июня 2011

При запуске следующего кода после компиляции на gcc я получаю ошибку сегментации.

#include <stdio.h>
#include <string.h>

int main(void)
{
    struct emp
    {
        char *n;
        int age;
    };

    struct emp e1={"David",23};
    struct emp e2=e1;
    strupr(e2.n);
    printf("%s\n%s\n",e1.n,e2.n);
    return(0);
}

Ответы [ 3 ]

4 голосов
/ 20 июня 2011

Строковые литералы, такие как "David", не могут быть изменены, что вы и делаете, когда вызываете strupr.Вы должны скопировать строку (например, с strdup) раньше.

1 голос
/ 20 июня 2011

Вы получаете ошибку сегмента, потому что

struct emp e1={"David",23};

«Дэвид» находится в данных, поэтому это строка только для чтения, или const.

Когда вы

strupr(e2.n);

Вы пытаетесь изменить ту же самую константную строку.

Рабочий код:

struct emp e2;
e2.age = e1.age;
e2.n = (char *)malloc(SOME_SIZE);
strcpy(e2.n, e1.n); //here you copy the contents of the read-only string to newly allocated memory
strupr(e2.n);
printf(...);
free(e2.n);
return 0;
0 голосов
/ 20 июня 2011

Делая struct emp e1={"David",23};, вы сделали «Дэвид» строковым литералом, который по своей природе доступен только для чтения.В исполняемом файле он хранится в .rodata или эквивалентном разделе исполняемого файла, который доступен только для чтения.strupr () вы пытаетесь изменить эти данные только для чтения, и, таким образом, возникает ошибка сегментации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...