我一直试图让我使用malloc初始化的所有指针都在一个指针数组中(或者是指向指针的指针),这样我就可以通过遍历该数组并使用类似free(ptr_array[i])的方法释放每个指针,而不必逐个释放。
我相信这是可能的,但是我的代码有些问题,因为用于释放所有内容的函数(如果可能的话,我宁愿将其保留在单独的函数中)显然无法正确地编辑“子指针”,并且它们似乎被复制,而不是像“主指针”那样。
以下是令我困惑的代码:
我相信这是可能的,但是我的代码有些问题,因为用于释放所有内容的函数(如果可能的话,我宁愿将其保留在单独的函数中)显然无法正确地编辑“子指针”,并且它们似乎被复制,而不是像“主指针”那样。
以下是令我困惑的代码:
#include <stdlib.h>
#include <stdio.h>
void free_test(int** arg){
printf("\tReceived arg addr: %p\n",arg);
printf("\tFreeing arg[0] = %p\n",arg[0]);
//And, just to MAKE SURE that arg[0] is ver, we do this:
printf("\tIn-function ver[0] = %d\n",arg[0][0]);
arg[0][0] = 2;
printf("\tIn-function ver[0] = %d\n",arg[0][0]);
free(arg[0]); //This one doesn't work...
free(arg); //This one works though.
}
int main(){
int** var;
int* ver;
int i;
printf("ver addr 1: %p\n", ver);
ver = malloc( sizeof(int) * 3 );
printf("ver addr 2: %p\n", ver);
for(i=0;i<3;i++){
ver[i] = 5*i;
}
for(i=0;i<3;i++){
printf("ver[%d]: %d\t(@ %p)\n",i,ver[i],&(ver[i]));
}
printf("var addr 1: %p\n", var);
var = malloc( sizeof(int *) );
printf("var addr 2: %p\n", var);
var[0] = ver;
printf("var[0] addr = %p\n", var[0]);
free_test(var);
printf("ver[0] new value: %d\n", ver[0]);
//free(var); (free(arg) works in the function, so this one throws an error.)
printf("So far so good, now break.\n");
free(ver);
printf("Didn't break. :(\n");
return 0;
}
目前它给出的输出如下:
ver addr 1: 0x8048679
ver addr 2: 0x8b0f008
ver[0]: 0 (@ 0x8b0f008)
ver[1]: 5 (@ 0x8b0f00c)
ver[2]: 10 (@ 0x8b0f010)
var addr 1: 0xad7ff4
var addr 2: 0x8b0f018
var[0] addr = 0x8b0f008
Received arg addr: 0x8b0f018
Freeing arg[0] = 0x8b0f008
In-function ver[0] = 0
In-function ver[0] = 2
ver[0] new value: 0
So far so good, now break.
Didn't break. :(
我对C语言不是很擅长,因此希望能得到帮助。特别是由于函数内部改变了ver[0]的值,但外部没有改变,我猜这可能与为什么free(...)无法正常工作有关。
提前感谢。
llvm-gcc-4.2
上的free(ver)
处一定会出错。 - Jackfree(...)
会将指针的第一个位置设置为0,而主函数中的free(ver)
则将其设置为可能是“随机”的值。这可能是特定于操作系统的实现(或gcc的),但我认为值得一提。 - Devvie