带有错误信号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;