malloc/free() 错误信号 6

malloc/free() with error signal 6

这是一个基本的堆栈实现代码。但是,它会生成信号中止。

int *arr;
int size = 2;
int top = 0;

int pop() {

    int i;
    if (top <= size / 4) {
        int *arr2 = (int*)malloc(sizeof(int) * size / 2);
        for ( i = 0; i < size; i++)
            arr2[i] = arr[i];
        free(arr);
        arr = arr2;
        size /= 2;
    }
    return arr[--top];
}

void push( int a) {

    int i;
    if (top >= size) {
        int *arr2 = (int*)malloc(sizeof(int)*size * 2);
        for ( i = 0; i < size; i++)
            arr2[i] = arr[i];
        free(arr);
        arr = arr2;
        size *= 2;
    }   
    arr[top++] = a;
}

这是输出:

*** glibc detected *** a.out: free(): invalid pointer: 0x0804a030 ***

并且调试数据显示 aborted sig 6 有趣的是它显示了 free() 行,但正如 4386427 所说,问题是在复制大小为

的 arr2 时访问内存越界

0 0xffffe410 in __kernel_vsyscall ()

1 0xb7e8a7d0 in raise () from /lib/libc.so.6

2 0xb7e8bea3 in abort () from /lib/libc.so.6

3 0xb7ebff8b in __libc_message () from /lib/libc.so.6

4 0xb7ec5911 in malloc_printerr () from /lib/libc.so.6

5 0xb7ec6f84 in free () from /lib/libc.so.6

6 0x080484a0 in pop () at stacks_eng.c:14

7 0x0804867e in main () at stacks_eng.c:55 (gdb) f 6

6 0x080484a0 in pop () at stacks_eng.c:14 14 free(arr);

可能还有更多问题,但这是一个开始:

int *arr2 = (int*)malloc(sizeof(int) * size / 2);

这使得 arr2 的大小是 size 一半 然后你做:

    for ( i = 0; i < size; i++)
        arr2[i] = arr[i];

所以你显然是在越界,即未定义的行为。

也许你想要:

size /= 2;

循环之前。

顺便说一句:检查 realloc 函数。这似乎是你需要的。它的性能会更好,您不必自己编写代码来复制元素。