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

Cod*_*der 2 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);
}
Run Code Online (Sandbox Code Playgroud)

基本上我想做的就是将一个空指针从my传递main给一个函数(alloco),它分配内存/填充指针所指向的相同位置并返回.我正确地获得了本地打印,这是在函数(alloco)内部但不是main.

我在这里做错了吗?

Sou*_*osh 8

C使用pass by值进行函数参数传递.您可以更改[ie ,, in ] 指向的地址值,但不能更改其值.换句话说,是功能的本地.改变的值将不被影响(反射到)存在于.appppaalloco()alloco()appppaalloco()ppaappmain()

如果要更改app自身的值alloco(),则需要将指针传递 app(Pointer-to-Pointer).

除了这个问题,在你的代码中

ppa = (int *)malloc(20);  
Run Code Online (Sandbox Code Playgroud)

是错的.你想要的实际上是

ppa = malloc(20 * sizeof (int)); //argument is in bytes, not in `int` or any elements
Run Code Online (Sandbox Code Playgroud)

或更好,

ppa = malloc(20 * sizeof * ppa);  //data type integrity
Run Code Online (Sandbox Code Playgroud)

此外,值得一提的是,请不要投入malloc()和家人的回报值C.

还有一件事,在打印指针时,使用%p格式说明符,打印size_t,使用%zu

printf("inside alloco %p\n",ppa);
Run Code Online (Sandbox Code Playgroud)

printf("size of a %zu\n", sizeof(ppa));  //sizeof returns size_t
Run Code Online (Sandbox Code Playgroud)


Jab*_*cky 6

你需要这个:

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;
}
Run Code Online (Sandbox Code Playgroud)

您的程序中,您传递一个alloco将在ppa参数中指向的指针。这个ppa参数就像内部的一个局部变量alloco,当你修改它时,你传递给函数的原始值mainapp )中不会被修改。

在修正版本,我们通过一个指针app。在alloco我们取消引用该指针并将 malloced 值写入它。

  • @Coder ,因为运算符优先级。在应用 `[15]` 运算符之前,您需要取消引用指针。 (2认同)