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);
可能会有更多问题,但这里有一个启动器:
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功能.这似乎是你需要的.它会表现得更好,你不必自己编写代码来复制元素.