2010-11-22 3 views
1

Я скопировать соответствующие строки:Сегментация Fault после небольшого изменения моего кода

(декларации)

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.

+0

Что такое `num` ?? – EboMike 2010-11-22 20:36:34

+0

Отредактировано сообщение. num - аргумент программы. Я выполняю это с num = 1 прямо сейчас и получаю ошибку. – bluehallu 2010-11-22 20:37:52

+0

Если num <= 9, я не вижу проблем с тем, что вы записали. Что вы подразумеваете под словом «код в произвольной точке»? – steabert 2010-11-22 20:44:16

ответ

2

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

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

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

1

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

0 == (n_fil * n_col/2) 

или каким-то образом

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

размер памяти, что вы просите за это 0, и поэтому calloc может возвращать NULL.

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

0

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

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

Смежные вопросы