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
中没有。
我在这里做错了吗?
答案 0 :(得分:8)
C
使用pass by值进行函数参数传递。您可以更改来自app
的{{1}} ppa
alloco()
所指向的地址的值,但不能更改{的值{1}}。换句话说,alloco()
是函数app
的本地。更改ppa
的值不会影响(反映到)alloco()
中的ppa
。
如果要从app
更改main()
本身的值,则需要将指针传递给应用程序(指针到指针)。
除了这个问题,在你的代码中
app
错了。你想要的实际上是
alloco()
或者更好,
ppa = (int *)malloc(20);
另外,值得一提的是do not cast 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
答案 1 :(得分:4)
你需要这个:
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
的{{1}}指针。此ppa
参数就像ppa
中的局部变量一样,当您修改它时,传递给alloco
(main
)中的函数的原始值不会被修改。
在更正后的版本中,我们将指针传递给app
。在app
中,我们取消引用该指针并将malloced值写入其中。