Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有错误信号6的malloc/free()_C_Memory_Malloc_Heap_Free - Fatal编程技术网

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

带有错误信号6的malloc/free(),c,memory,malloc,heap,free,C,Memory,Malloc,Heap,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];

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

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;
}
调试数据显示中止的sig 6有趣的是,它显示了free()的行,但正如4386427所说,问题是在复制大小为的arr2时访问超出内存界限的内存

内核vsyscall()中的0 0xFFFFFF410 从/lib/libc.so.6提升()中的1 0xb7e8a7d0 2/lib/libc.so.6中的abort()中的0xb7e8bea3 来自/lib/libc.so.6的消息()中的0xb7ebff8b 来自/lib/libc.so.6的malloc_printerr()中的4 0xb7ec5911 来自/lib/libc.so.6的free()中的5 0xb7ec6f84 堆叠处的6 0x080484a0在pop()中,工程c:14 烟囱处的7 0x0804867e主管道()工程c:55(gdb)f 6 6 0x0804a0在烟囱处的pop()中,工程c:14 14自由(arr);
可能还有更多问题,但这里有一个开端:

int *arr2 = (int*)malloc(sizeof(int) * size / 2);
这使得
arr2
的大小为
size
一半,然后执行以下操作:

    for ( i = 0; i < size; i++)
        arr2[i] = arr[i];
在循环之前


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

如何以及在哪里初始化
arr
程序?程序在什么输入上崩溃?提供一个已返回的ARR,它已经是免费的.D.OT:您应该考虑将<代码> ARR 、<代码> Tope、<代码>大小>代码>放入一个结构中,并将该结构传递给<代码> Pux<代码> />代码> POP<代码>函数。全局变量不好…另一方面,非常感谢。它显然起了作用。我之所以忽略了这一点,是因为我更关注gdb指向的free()函数。由于可能有点复杂,我无法分析Valgrind的反馈。我希望我能听他的话。是的,一定要调查一下
realloc
。它将使您不必每次都复制阵列,因为当调整到更小的尺寸时,阵列将能够简单地缩小其占地面积,并且在增长时,如果可能,阵列将在适当的位置增长<除了code>realloc之外,您还可以使用
memcpy
复制一组连续的内存。
    for ( i = 0; i < size; i++)
        arr2[i] = arr[i];
size /= 2;