Ошибка сегментации после небольшой модификации моего кода - PullRequest
1 голос
/ 22 ноября 2010

Я скопирую соответствующие строки:

(Объявления)

typedef struct { /* per una entrada de la taula de posicion */
    int f;
    int c;
} pos;
pos *p_opo[9];

(в основном)

for (i = 0; i < num; i++) {
        p_opo[i] = (pos *) calloc(n_fil * n_col / 2, sizeof (pos)); 
    }

Теперь, только введя эти строкикод разрывается в произвольной точке (при вызове заданной библиотечной функции).Я подозреваю, что что-то искажаю этим, хотя я не знаю, что.

Все, что я хочу, это иметь массив массивов переменного размера!

PD: num - аргументпрограмма.Я все равно запускаю его с num = 1.

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

num должно быть меньше или равно 9. (0..8 выделенных указателей в p_opo равно 9!)

Обратите внимание, что в C вы получаете ошибки в другом месте в случае утечек памяти и т. Д. Причина этого заключается в том, что при изменении некоторого кода другой код или данные могут быть переставлены, что может привести к ошибкам сегментации.

Так что проблема вполне может быть в другой части вашей программы. Убедитесь, что у вас есть все предупреждения (например, опция -Wall в gcc), это может дать вам некоторые подсказки.

1 голос
/ 22 ноября 2010

Если ваш вызов calloc запрашивает память размером 0, он может вернуть NULL, а если вы используете эту память, это может вызвать ошибку сегментации.Так что если:

 0 == (n_fil * n_col / 2)

или как-то

0 == sizeof (pos)            /* I don't think that this is possible */

, размер памяти, который вы запрашиваете, равен 0, и поэтому calloc может вернуть NULL.это не тот случай, тогда я не думаю, что у вас есть достаточно кода, чтобы кто-нибудь мог понять, почему это segfaulting.Следует помнить, что подобные ошибки могут остаться незамеченными, пока вы не добавите или не измените какой-либо код, который, по-видимому, совершенно не связан с кодом, в котором есть настоящая ошибка.

0 голосов
/ 23 ноября 2010

Видя, что вы разыгрываете возвращение calloc, я становлюсь подозрительным. Не делайте этого, это приведет к типичной ошибке, если вы забудете включение для системной функции.

Это радует, если вы работаете на машине с 64-битными указателями и 32-битными int.

...