Ошибка сегментации при копировании строки

Я получаю ошибку сегментации для внутреннего цикла while.

char **c;
c=(char **)malloc(3*(N-1)*sizeof(char *));

for(int i=0;i<3*(N-1);)
{
    char *temp;
    gets(temp);
    while(*temp!='$')
    {
        j=0;
        while(*temp!=' ')
        {
            *(c[i]+j)=*(temp+j);
            j++;
        }
        i++;
    }
    i++;
}        

извините за неправильный отступ. Я знаю, что манипулирование строками char * вызовет ошибку. Но я не уверен в этой ошибке. Я пытался разбить строку tmp на три разные строки.


person Amit Gupta    schedule 05.11.2012    source источник
comment
Вы должны скомпилировать со всеми предупреждениями и отладочной информацией (например, с gcc -Wall -g в Linux) и использовать отладчик (например, gdb в Linux). Обучение использованию отладчика (и компилятора) практически является частью процесса обучения программированию на C. Вы также можете использовать детектор утечки памяти, такой как valgrind   -  person Basile Starynkevitch    schedule 05.11.2012
comment
Вам также следует избегать использования gets, поскольку это опасная устаревшая функция (и удаленная из последнего стандарта C). Вы можете использовать getline или fgets   -  person Basile Starynkevitch    schedule 05.11.2012


Ответы (3)


1) temp должен быть блоком памяти (буфером) для копирования строки gets.

char *temp = malloc (256 * sizeof(char)); /* 256 as example*/

2) для линии

while(*temp!='$')

и

while(*temp!=' ')

мы ожидаем найти некоторое увеличение для указателя temp (например, temp++) для обоих циклов, но этого не происходит. и это вызывает проблему

Если я могу догадаться, что вам нужно, здесь после исправления вашего кода (я не проверял его)

char **c;
c=(char **)malloc(3*(N-1)*sizeof(char *));

char copy[256];
char temp[256], *p;

for(int i=0;i<3*(N-1);i++)
{
    p = temp;
    gets(p);
    while(*p!='$')
    {
        j=0;
        while(*p!=' ')
        {
            *(copy+j)=*p;
            j++;
            p++;
        }
        if(*p=='\0')
            break;
        p++;
    }
    copy[j] = '\0'
    c[i] = strdup(copy); // allocate memory with size of copy string and then copy the content of copy to allocated memory
}  
person MOHAMED    schedule 05.11.2012
comment
Спасибо. Подскажите, пожалуйста, как ввести строку, не зная заранее ее размера? - person Amit Gupta; 05.11.2012

Вы выделяете место только для 3 * (N - 1) указателей на строки, но не для самих символов. Указатель temp также не инициализирован, но вы все еще пишете через него, используя gets(). Это приводит к неопределенному поведению.

Кроме того, вы не должны приводить возвращаемое значение malloc() в C.

person unwind    schedule 05.11.2012
comment
Я думаю, нам не нужно выделять место для char * - person Amit Gupta; 05.11.2012

Память не выделена для переменной temp.

char *temp;
gets(temp);
person Jeyaram    schedule 05.11.2012
comment
да. в противном случае указатель будет указывать на какое-то мусорное место. поэтому, когда вы пытаетесь сослаться на него, возникает ошибка сегмента. Либо динамически, либо статически, скажем, char temp[100]; - person Jeyaram; 05.11.2012