ошибка сегментации при разборе списка целых чисел - PullRequest
1 голос
/ 17 мая 2010
       int num_arrays;
       char *p[20];
       char tempc;       
       int i=0;
       do
       { p[i]=malloc(sizeof(int));
        scanf("%s",p[i]);
        tempc=*p[i];
        ++i;
        }while(tempc=='x');
        num_arrays=atoi(p[0]);

Когда я пишу num_arrays=atoi(..), gcc дает мне ошибку сегментации или память стек превышен, я не понимаю, почему он так себя ведет Кто-нибудь может объяснить, почему?

Ответы [ 2 ]

4 голосов
/ 17 мая 2010

Вы не выделили никакой памяти в p, поэтому ее элементы указывают на случайные места. Вы можете выделить память для строк с максимальной длиной 100, например:

int i;
for (i = 0; i < 20; i++)
  p[i] = malloc(101);

Или же вы хотите массив символов , а не строк, в этом случае вы должны объявить его как

char p[20];

В этом случае вы не должны пытаться читать строки в каждом элементе с помощью scanf.

Обновление после добавления отсутствующей части кода:

Вы выделяете sizeof(int) байтов памяти для ваших строк, что, скорее всего, равно 4, т. Е. Ваши входные строки, считываемые scanf, не должны быть длиннее 3 символов. В противном случае вы получите ошибку переполнения буфера, которая может привести к ошибке сегментации, с которой вы боретесь.

Более того, tempc=p[i] присваивает значение указателя символьной переменной! Это значение, преобразованное в символ, почти наверняка никогда не будет равно 'x'.

Полагаю, вы пытаетесь получить первый символ p[i], который будет p[i][0] или *p[i].

Я также подозреваю, что ваше состояние цикла противоположно тому, что вы имели в виду: сейчас цикл повторяется, пока tempc равен 'x' - вы, вероятно, хотели повторить до tempc становится 'x'. И вам также следует проверить, что ваш цикл не работает более 20 раз:

  ...
}while(tempc != 'x' && i < 20);
4 голосов
/ 17 мая 2010

Вы не выделяете память для своих строк. ( Редактировать: Теперь вы есть)

Возможно, вы также захотите убедиться, что вы не выполняете более 20 итераций, поскольку ваш массив char * содержит только 20 элементов.

Также при условии, что sizeof (int) == 4, ваши строки не должны быть больше 4 символов, как у вас сейчас, и 1 из них должен быть нулевым завершением. Вы можете выделить больше места для этих входных строк.

...