c - malloc/free() 带有错误信号 6

标签 c memory malloc heap-memory free

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

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 大小时访问内存越界

enter image description here

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函数。这似乎就是你所需要的。它会表现得更好,并且您不必自己编写代码来复制元素。

关于c - malloc/free() 带有错误信号 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447496/

相关文章:

返回 malloc 的函数内出现 C 错误?

c - 使用 Valgrind 检查后如何查找和删除我的 C 程序中的内存泄漏和错误

c - 当使用不同的文件描述符时,为什么结果不同? (系统编程)

C++ - 直接写入内存(内核)

c++ - 关于内存的动态特性,C++ 示例

php内存限制和读/写临时文件

c - 在C中为字符串分配内存

c - 为什么需要将 NUL 字符附加到数组中?

Char* 从 char 数组中解析错误

c - while(scanf) : why does using getchar() keep the input going 输入问题