malloc/free() 错误信号 6
malloc/free() with error signal 6
这是一个基本的堆栈实现代码。但是,它会生成信号中止。
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
函数。这似乎是你需要的。它的性能会更好,您不必自己编写代码来复制元素。
这是一个基本的堆栈实现代码。但是,它会生成信号中止。
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
函数。这似乎是你需要的。它的性能会更好,您不必自己编写代码来复制元素。