在函数内创建的动态内存

tom*_*h13 5 c pointers

我想知道为什么这段代码不起作用的技术原因(在内存方面):

#include <stdio.h>
#include <stdlib.h>

int* fun(int*);
int main()
{
  int a=5;
  int* ptr;
  //  ptr=(int*)malloc(sizeof(int));
  fun(ptr);
  a=*ptr;

  printf("\n the val of a is:%d",a);
  return 0;
}

void fun(int* ptr)
{

  ptr = (int*)malloc(sizeof(int));
  *ptr = 115;


}
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?我认为堆(更重要的是地址)对于堆栈中的所有函数变量是通用的.

另外,为什么这会起作用.如果我评论函数内部的内存分配乐趣并取消注释main中的内存分配.它工作正常.

Dev*_*lar 14

在C中,一切都按值传递.

你传递给fun()的是你在main()中的指针的副本.

这意味着ptr 的副本针对分配的内存,并且该内存设置为115.

main()中的ptr仍指向未定义的位置,因为它从未被分配过.

尝试将指针传递给指针,以便fun()您可以访问指针本身:

#include <stdio.h>
#include <stdlib.h>

int* fun(int**); // <<-- CHANGE
int main()
{
    int a=5;
    int* ptr;
    //  ptr=(int*)malloc(sizeof(int));
    fun(&ptr); // <<-- CHANGE
    a=*ptr;

    printf("\n the val of a is:%d",a);
    return 0;
}

int* fun(int** another_ptr) // <<-- CHANGE
{

    *another_ptr = (int*)malloc(sizeof(int)); // <<-- CHANGE
    **another_ptr = 115; // <<-- CHANGE
    return *another_ptr;
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是fun()实际返回更新的指针(如公布的那样),并将其分配给ptr:

#include <stdio.h>
#include <stdlib.h>

int* fun(int*);
int main()
{
    int a=5;
    int* ptr;
    //  ptr=(int*)malloc(sizeof(int));
    ptr = fun(ptr); // <<-- CHANGE
    a=*ptr;

    printf("\n the val of a is:%d",a);
    return 0;
}

int* fun(int* another_ptr)
{
    another_ptr = (int*)malloc(sizeof(int));
    *another_ptr = 115;
    return another_ptr; // <<-- CHANGE
}
Run Code Online (Sandbox Code Playgroud)

编辑:我重命名了变量,fun()以明确它与您使用的变量不同main().同名在这里没有任何意义.