这是一个基本的堆栈实现代码。但是,它会生成中止信号。
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
函数。这似乎就是你所需要的。它会表现得更好,并且您不必自己编写代码来复制元素。
关于c - malloc/free() 带有错误信号 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447496/