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
中。
我在这里做错了什么吗?
C
使用按值传递进行函数参数传递。您可以从 app
更改 ppa
[即 alloco()
中的 alloco()
] 指向的地址处的值,但不能更改
app
的值。换句话说,ppa
对于函数alloco()
来说是局部的。更改 ppa
的值不会影响(反映)app
中存在的 main()
。
如果您想从
app
更改 alloco()
本身的值,您需要将 指针传递给 应用程序 (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
值得一提的是,请不要在malloc()
中投
C
和家人的返回值。
还有一件事,在打印指针时,使用
%p
格式说明符,在打印size_t
时,使用%zu
,就像
printf("inside alloco %p\n",ppa);
和
printf("size of a %zu\n", sizeof(ppa)); // sizeof returns size_t
你需要这个:
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;
}
在 your 程序中,您传递一个指向
alloco
的指针,该指针将位于 ppa
参数中。这个 ppa
参数就像 alloco
内部的局部变量一样,当你修改它时,你传递给 main
(app
) 中函数的原始值不会被修改。
在更正后的版本中,我们将 pointer 传递给
app
。在alloco
中,我们取消引用该指针并将分配的值写入其中。