这个问题在这里已经有了答案:
How can I allocate memory and return it (via a pointer-parameter) to the calling function?
(11 个回答)
6年前关闭。
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
的值不会影响(反射(reflect)到)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
另外值得一提的是,请do not cast
malloc()
的返回值和家人在C
.还有一件事,在打印指针时,使用
%p
格式说明符,同时打印 size_t
, 使用 %zu
, 喜欢printf("inside alloco %p\n",ppa);
和
printf("size of a %zu\n", sizeof(ppa)); //sizeof returns size_t
关于在函数内部更改指针不会反射(reflect)在函数外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29965992/