函数调用中的malloc似乎在返回时被释放?

我想我已经把它归结为最基本的情况:

int main(int argc, char ** argv) { int * arr; foo(arr); printf("car[3]=%d\n",arr[3]); free (arr); return 1; } void foo(int * arr) { arr = (int*) malloc( sizeof(int)*25 ); arr[3] = 69; } 

输出是这样的:

 > ./a.out car[3]=-1869558540 a.out(4100) malloc: *** error for object 0x8fe01037: Non-aligned pointer being freed *** set a breakpoint in malloc_error_break to debug > 

如果有人能够阐明我的理解失败的地方,我们将不胜感激。

你通过值传递指针,而不是通过引用,所以无论你在foo中使用arr做什么都不会在foo函数之外产生差异。 正如m_pGladiator写的一种方法是声明对这样的指针的引用(只能在C ++ btw中使用.C不知道引用):

 int main(int argc, char ** argv) { int * arr; foo(arr); printf("car[3]=%d\n",arr[3]); free (arr); return 1; } void foo(int * &arr ) { arr = (int*) malloc( sizeof(int)*25 ); arr[3] = 69; } 

另一种(更好的imho)方法是不将指针作为参数传递,而是返回指针:

 int main(int argc, char ** argv) { int * arr; arr = foo(); printf("car[3]=%d\n",arr[3]); free (arr); return 1; } int * foo(void ) { int * arr; arr = (int*) malloc( sizeof(int)*25 ); arr[3] = 69; return arr; } 

并且您可以将指针传递给指针。 这是通过引用传递的C方式。 使语法复杂但很好 – 这就是C的方式……

 int main(int argc, char ** argv) { int * arr; foo(&arr); printf("car[3]=%d\n",arr[3]); free (arr); return 1; } void foo(int ** arr ) { (*arr) = (int*) malloc( sizeof(int)*25 ); (*arr)[3] = 69; } 

你已经在foo中分配了arr,但是指针值存储在调用堆栈中。 如果你想这样做,那就这样做:

 void foo( int ** arr) { *arr = (int *)malloc( sizeof(int) * 25 ); (*arr)[3] = 69; } 

在main中,只需将指针传递给foo(如foo(&arr))

foo接收int指针的本地副本,alloactes内存并在内存超出范围时泄漏该内存。

解决此问题的一种方法是让foo返回指针:

 int * foo() { return (int*) malloc( sizeof(int)*25 ); } int main() { int* arr = foo(); } 

另一种方法是将指针传递给指针

 void foo(int ** arr) { *arr = malloc(...); } int main() { foo(&arr); } 

在C ++中,修改foo以接受对指针的引用更简单。 C ++中唯一需要改变的是将foo更改为

 void foo(int * & arr) 

由于您按值传递指针,因此main内的arr指针不指向已分配的内存。 这意味着两件事:你有自己的内存泄漏(不,函数foo完成后内存没有释放),当你访问main中的arr指针时,你正在访问一些任意范围的内存,因此你不要得到3打印出来因此free()拒绝工作。 你很幸运在main中访问arr [3]时没有出现分段错误。

如果参数(&)没有传入,则无法更改参数(arr)的值。 通常,您希望返回指针,因此您的方法应该是:

ARR = FOO();

试图重新分配论点是不好的juju; 我不推荐(&)解决方案。