malloc/free(),错误信号6

rol*_*oll -1 c memory heap malloc 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;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

*** glibc detected *** a.out: free(): invalid pointer: 0x0804a030 ***
Run Code Online (Sandbox Code Playgroud)

并且调试数据显示中止的sig 6有趣的是它显示了free()行但是4386427说,问题是在复制大小的arr2时访问超出内存范围

在此输入图像描述

__kernel_vsyscall()中的0 0xffffe410

来自/lib/libc.so.6的raise()中的1 0xb7e8a7d0

来自/lib/libc.so.6的abort()中的0xb7e8bea3

来自/lib/libc.so.6的__libc_message()中的3 0xb7ebff8b

来自/lib/libc.so.6的malloc_printerr()中的0xb7ec5911

来自/lib/libc.so.6的free()中的5 0xb7ec6f84

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

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

6 0x080484a0在stacks_eng.c弹出():14 14自由(ARR);

438*_*427 5

可能会有更多问题,但这里有一个启动器:

int *arr2 = (int*)malloc(sizeof(int) * size / 2);
Run Code Online (Sandbox Code Playgroud)

这使得大小arr2BE 一半size,然后你做:

    for ( i = 0; i < size; i++)
        arr2[i] = arr[i];
Run Code Online (Sandbox Code Playgroud)

所以你明确写出界限,即未定义的行为.

也许你想要:

size /= 2;
Run Code Online (Sandbox Code Playgroud)

循环之前.

顺便说一句:检查realloc功能.这似乎是你需要的.它会表现得更好,你不必自己编写代码来复制元素.