更改函数内部的指针不会反映在函数外部

void alloco(int *ppa) { int i; printf("inside alloco %d\n",ppa); ppa = (int *)malloc(20); ppa[15] = 9; printf("size of a %d \n", sizeof(ppa)); for(i=0;i<20;i++) printf("a[%d] = %d \n", i, ppa[i]); } int main() { int *app = NULL; int i; printf("inside main\n"); alloco(app); for(i=0;i<20;i++) printf("app[%d] = %d \n", i, app[i]); return(0); } 

基本上我想做的就是将一个空指针从我的main传递给一个函数( alloco ),它分配内存/填充指针所指向的相同位置并返回。 我正确地获得了本地打印,这是在函数内部( alloco )但不在main

我在这做错了吗?

你需要这个:

 void alloco(int **ppa) { int i; printf("inside alloco %p\n",ppa); *ppa = malloc(20 * sizeof(int)); (*ppa)[15] = 9; // rather pointless, in the loop below (*ppa)[15] will be // overwritten anyway printf("size of a %d \n", sizeof(*ppa)); // rather pointless, not sure // what you want to print here for(i = 0; i < 20; i++) printf("a[%d] = %d \n", i, (*ppa)[i]); } int main() { int *app = NULL; // you can drop the '= NULL', it's useless, because int i; // alloco(&app) will change the value of app anyway printf("inside main\n"); alloco(&app); for(i = 0; i < 20; i++) printf("app[%d] = %d \n", i, app[i]); return 0; } 

你的程序中,你传递一个指向alloco的指针,它将在ppa参数中。 这个ppa参数就像是alloco的局部变量,当你修改它时,传递给mainapp )中的函数的原始值将不会被修改。

在更正后的版本中,我们传递指向 app指针 。 在alloco我们取消引用该指针并将malloced值写入其中。

C使用pass by值进行函数参数传递。 您可以从alloco()更改app [ie, ppaalloco() ]指向的地址值,但不能更改app的值。 换句话说, ppaalloco()本地function。 更改ppa的值不会影响(反映到) main() app

如果要从alloco()更改app本身的值,则需要将指针传递 app( Pointer-to-Pointer )。

除了这个问题,在你的代码中

 ppa = (int *)malloc(20); 

是错的。 你想要的实际上是什么

 ppa = malloc(20 * sizeof (int)); //argument is in bytes, not in `int` or any elements 

或更好,

 ppa = malloc(20 * sizeof * ppa); //data type integrity 

另外,值得一提的是,请不要在Cmalloc()和family的返回值。

还有一件事,在打印指针时 ,使用%p格式说明符,而打印size_t ,使用%zu ,就像

 printf("inside alloco %p\n",ppa); 

 printf("size of a %zu\n", sizeof(ppa)); //sizeof returns size_t