更改函数内的指针不会反映在函数外部

时间:2015-04-30 11:01:39

标签: c pointers

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中没有。

我在这里做错了吗?

2 个答案:

答案 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中的局部变量一样,当您修改它时,传递给allocomain)中的函数的原始值不会被修改。

在更正后的版本中,我们将指针传递给app。在app中,我们取消引用该指针并将malloced值写入其中。