在函数内部更改指针不会反射(reflect)在函数外部

标签 c pointers

这个问题在这里已经有了答案:





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/

相关文章:

c - 如何指向预分配内存上的 2D/3D 空间

memory - 有人可以解释 Marshal.StructureToPtr

使用指针在函数内调用函数 - C

c - C 中的二维字符串数组

c - 通过计算帮助选择,无需 if 语句

c - 为什么在 C 中不允许使用表达式 c=(a+b)++?

c++ - C/C++ 是否提供最短执行时间的任何保证?

c - 这两个地址怎么会不同呢?

c - C 中结构体指针的问题

c - fgets和gets之间的区别