2016-01-18 2 views
0

Я пишу небольшое консольное приложение для командной строки Windows.бесплатный сбой с сигналом SIGTRAP

Im выделение памяти для двух массивов, chi и chi_comp так:

/* allocating memory for chi */ 
if ((chi = (int *)malloc(cm * sizeof(int))) == NULL) 
{ 
    printf("Error allocating %i bytes of memory.\n", lm * sizeof(int)); 
    return CMD_NONE; 
} 

/* allocating memory for chi_comp */ 
if ((chi_comp = (int *)malloc(cm * sizeof(int))) == NULL) 
{ 
    printf("Error allocating %i bytes of memory.\n", cm * sizeof(int)); 
    return CMD_NONE; 
} 

Чуть позже в коде я инициализировать их

for (i = 0; i < cm; i++) 
{ 
    chi[i] = -1; 
    chi_comp[i] = -1; 
} 

и использовать их как

chi[grade] = i; 
chi_comp[i] = grade; 

и

if (chi_comp[i] != -1) 
{ 
    printf(" %i ", v[chi_comp[i]][0]); 
} 

Работа с ними работает нормально, но когда я пытаюсь освободить память, когда мне это не нужно, программа больше не сработает.

free(chi); 
free(chi_comp); 

Отладка с результатами GdB следующее:

предупреждения: КУЧА [m.exe]: предупреждение: Heap блок на 003518B8 модифицированном в 003518CC мимо запрашиваемым размером с

Программа получила сигнал SIGTRAP, ловушка Trace/breakpoint. 0x776f0b2d в NTDLL RtlpNtEnumerateSubKey() из C: \ Windows \ system32 \ ntdll.dll

чи в этом случае значения 003518C0 и chi_comp значения 003518E8

+1

Я думаю, что вы собираетесь за пределы где-то в коде, так что проверить счетчики! – gsamaras

+0

'chi [grade] = i;' вы проверили 'grade is

+0

@SouravGhosh да –

ответ

2

Из сообщения об ошибке:

предупреждение: HEAP [m.exe]: предупреждение: блок кучи при 003518B8, измененный в 003518CC, запрашиваемый размер c

Я подозреваю, что вы выходите за пределы своего кода, поэтому, пожалуйста, проверьте свои счетчики. Что говорит мне, что это прошлый запрошенный размер. Убедитесь, что вы дважды читаете сообщения об ошибках, они для вашего же блага. :)


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

2

После comments под вопросом,

кажется, что в вашем коде, говоря

chi[grade] = i; 

вы собираетесь за пределы. Доступ из связанной памяти вызывает undefined behavior .Вы должны поставить галочку, как

if (grade < cm) 
     chi[grade] = i;  
Смежные вопросы