调用使用 malloc [duplicate] 的函数时显示变量未初始化

shows variable uninitialized when calling a function that uses malloc [duplicate]

提问人:DatMomoAgain 提问时间:1/31/2022 最后编辑:Vlad from MoscowDatMomoAgain 更新时间:1/31/2022 访问量:66

问:

# include<stdio.h>
# include<stdlib.h>
void fun(int *a)
{
  a = (int*)malloc(sizeof(int));
}
int main(void)
{
  int *p;
  fun(p);
  *p = 6;
  printf("%d\n",*p);
  free(p);
  return(0);
}

在 vs code 中,这显示错误,因为 int *p 未初始化,并告诉我将变量“p”初始化为 NULL 以静音此警告。但是当我这样做时,它编译但显示分段错误,可能是因为我将 6 分配给空地址,那么我该如何解决这个问题?

C 函数 初始化 按引用传递 值传递

评论

1赞 kaylum 1/31/2022
函数参数在 C 中按值传递。函数中的局部变量也是如此。设置它不会更改调用方的变量。有关更多详细信息和建议的修复,请参阅重复的帖子。a
1赞 Andreas Wenzel 1/31/2022
侧节点:你可能想读这个:我投出 malloc 的结果吗?

答:

2赞 Vlad from Moscow 1/31/2022 #1

此功能

void fun(int *a)
{
  a = (int*)malloc(sizeof(int));
}

更改自己的局部变量(参数)。也就是说,该函数处理传递指针值的副本ap

int *p;
fun(p);

指针保持不变且未初始化。p

要使程序正确,您需要按以下方式更改代码

void fun(int **a)
{
  *a = (int*)malloc(sizeof(int));
}

//...

int *p;
fun( &p);

尽管在这种情况下,最好声明和定义函数,例如

int * fun( void )
{
   return malloc(sizeof(int));
}

//...

int *p = fun();

if ( p ) 
{
    *p = 6;
    printf("%d\n",*p);
}

free(p);