更改函数内部的指针不会反映在函数外部
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
的局部变量,当你修改它时,传递给main
( app
)中的函数的原始值将不会被修改。
在更正后的版本中,我们传递指向 app
的指针 。 在alloco
我们取消引用该指针并将malloced值写入其中。
C
使用pass by值进行函数参数传递。 您可以从alloco()
更改app
[ie, ppa
, alloco()
]指向的地址的值,但不能更改app
的值。 换句话说, ppa
是alloco()
本地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
另外,值得一提的是,请不要在C
中malloc()
和family的返回值。
还有一件事,在打印指针时 ,使用%p
格式说明符,而打印size_t
,使用%zu
,就像
printf("inside alloco %p\n",ppa);
和
printf("size of a %zu\n", sizeof(ppa)); //sizeof returns size_t