更改函数内部的指针不会反映在函数外部[重复]

问题描述 投票:0回答:2
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 pointers
2个回答
9
投票

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

7
投票

你需要这个:

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
中,我们取消引用该指针并将分配的值写入其中。

© www.soinside.com 2019 - 2024. All rights reserved.