2014-02-04 3 views
0

Я получаю сообщение об ошибке: * обнаружен Glibc randtest: свободный(): недействительный следующий размер (нормальный): 0x00000000023abbe0 * *, когда одна из двух вещей происходит. Во-первых, когда я пытаюсь освободить память, у меня есть malloced или (после удаления этого кода) возвращается мой основной метод (который также будет освобождать эту память неявно).Glibc обнаружен - основной метод, разбивающихся о возвращении

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

int main(int argc, char **argv) { 
int tests = 10; 
int i; 
int j; 
int *array1; 
int *array2; 
int holder; 
int size1; 
int size2; 
for(i = 0; i < tests; i++){ 
    size1 = rand() % 30; 
    array1 = malloc(sizeof(int) * (size1)); 
    size2 = rand() % 30; 
    array2 = malloc(sizeof(int) * (size2)); 
    for (j = 0; j < size1; j++){ 
     if (j == 0) 
      holder = 0; 
     else 
      holder = array1[j-1]; 
     array1[j] = rand() %5 + holder; 
    } 
    for (j = 0; j < size1; j++){ 
     if (j == 0) 
      holder = 0; 
     else 
      holder = array2[j-1]; 
     array2[j] = rand() %5 + holder; 
    } 
    merge(array1, size1, array2, size2); 
    //assert(isSorted(merge(array1, size1, array2, size2), size1+size2) == 0); 
} 
return 0; 
} 

Полный след ошибка:

======= Backtrace: ========= 
/lib64/libc.so.6[0x3751876166] 
/lib64/libc.so.6[0x3751878c93] 
/lib64/libc.so.6(fclose+0x14d)[0x37518667cd] 
randtest[0x4019df] 
randtest[0x402306] 
/lib64/libc.so.6(exit+0xe2)[0x3751835e22] 
/lib64/libc.so.6(__libc_start_main+0x104)[0x375181ed24] 
randtest[0x400d09] 
======= Memory map: ======== 
00400000-00404000 r-xp 00000000 00:22 33295023           /nfs/stak/students/t/todtm/src/midterm/randtest 
00603000-00604000 rw-p 00003000 00:22 33295023        /nfs/stak/students/t/todtm/src/midterm/randtest 
00604000-00605000 rw-p 00000000 00:00 0 
023ab000-023cc000 rw-p 00000000 00:00 0         [heap] 
3751000000-3751020000 r-xp 00000000 fd:00 131107       /lib64/ld-  2.12.so 
375121f000-3751220000 r--p 0001f000 fd:00 131107       /lib64/ld-2.12.so 
3751220000-3751221000 rw-p 00020000 fd:00 131107       /lib64/ld-2.12.so 
3751221000-3751222000 rw-p 00000000 00:00 0 
3751800000-375198b000 r-xp 00000000 fd:00 131112       /lib64/libc-2.12.so 
375198b000-3751b8a000 ---p 0018b000 fd:00 131112       /lib64/libc-2.12.so 
3751b8a000-3751b8e000 r--p 0018a000 fd:00 131112       /lib64/libc-2.12.so 
3751b8e000-3751b8f000 rw-p 0018e000 fd:00 131112       /lib64/libc-2.12.so 
3751b8f000-3751b94000 rw-p 00000000 00:00 0 
3751c00000-3751c83000 r-xp 00000000 fd:00 131151       /lib64/libm-2.12.so 
3751c83000-3751e82000 ---p 00083000 fd:00 131151       /lib64/libm-2.12.so 
3751e82000-3751e83000 r--p 00082000 fd:00 131151       /lib64/libm-2.12.so 
3751e83000-3751e84000 rw-p 00083000 fd:00 131151       /lib64/libm-2.12.so 
3756400000-3756416000 r-xp 00000000 fd:00 131134       /lib64/libgcc_s-4.4.7-20120601.so.1 
3756416000-3756615000 ---p 00016000 fd:00 131134       /lib64/libgcc_s-4.4.7-20120601.so.1 
3756615000-3756616000 rw-p 00015000 fd:00 131134       /lib64/libgcc_s-4.4.7-20120601.so.1 
7fd4fae39000-7fd4fae3c000 rw-p 00000000 00:00 0 
7fd4fae65000-7fd4fae68000 rw-p 00000000 00:00 0 
7fffbdf80000-7fffbdf95000 rw-p 00000000 00:00 0       [stack] 
7fffbdfff000-7fffbe000000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Abort (core dumped) 

Любые идеи о том, что я делаю не так?

ответ

0

Это предположительно просто случай «неопределенного поведения», так как вы используете size1 для своего цикла, который инициализируется array2. После того, как вы записали за пределами памяти, выделенной для array2, вы перезаписываете некоторые дополнительные данные malloc, чтобы отслеживать выделения памяти, и в этот момент все ставки отключены.

Кроме того, если вам нужны случайные числа, вы должны позвонить srand, чтобы выровнять RNG.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(int argc, char **argv) { 
    int tests = 10; 
    int i, j; 
    int *array1, *array2; 
    int size1, size2; 

    srand((unsigned)time(NULL)); 

    for(i = 0; i < tests; i++){ 

    size1 = rand() % 30; 
    array1 = malloc(sizeof(int) * size1); 

    size2 = rand() % 30; 
    array2 = malloc(sizeof(int) * size2); 

    array1[0] = rand() % 5; 
    for (j = 1; j < size1; j++) 
     array1[j] = rand() % 5 + array1[j-1]; 

    array2[0] = rand() % 5; 
    for (j = 1; j < size2; j++) 
     array2[j] = rand() % 5 + array2[j-1]; 

    merge(array1, size1, array2, size2); 

    //assert(isSorted(merge(array1, size1, array2, size2), size1+size2) == 0); 
    } 

    return 0; 
} 
Смежные вопросы