You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中在函数内修改结构体指针内容失败,该如何正确实现?

问题根因

C语言所有参数都是值传递,你向enter函数传入的是person_1指针本身的副本,函数内部给struct_pointer赋值malloc返回的地址,只会修改副本的指向,完全不会影响外部的person_1变量。因此函数执行完成后,person_1仍然是NULL,后续执行person_1->code属于访问空指针,会触发段错误,自然没有正常输出。

解决方法

该需求完全可以实现,常用有两种修改方案:

方案1:传入二级指针修改原指针

把外部指针的地址传入函数,通过解引用二级指针直接修改原指针的指向,修改后代码如下:

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

typedef struct
{
  int age;
  int code;
}person;

// 参数改为二级指针,接收外部指针的地址
void enter(person **struct_pointer);

// 标准写法建议用int main而非void main
int main(void)
{
  person *person_1 = NULL;
  // 传入person_1的地址
  enter(&person_1);
  printf("CODE: %i\n", person_1->code);
  free(person_1);
  return 0;
}

void enter(person **struct_pointer)
{
  // 先解引用一层拿到外部原指针,再给它赋值malloc的地址
  *struct_pointer = malloc(sizeof(**struct_pointer));
  // 判空是好习惯,避免malloc失败触发野指针
  if(*struct_pointer == NULL) {
      return;
  }
  (*struct_pointer)->age = 10;
  (*struct_pointer)->code = 5090;
}

方案2:函数返回初始化完成的结构体指针

直接让enter函数分配内存、初始化后把指针返回,由外部变量接收即可,代码更简洁:

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

typedef struct
{
  int age;
  int code;
}person;

// 函数返回值改为person*类型
person* enter(void);

int main(void)
{
  person *person_1 = enter();
  if(person_1 != NULL) {
      printf("CODE: %i\n", person_1->code);
      free(person_1);
  }
  return 0;
}

person* enter(void)
{
  person *p = malloc(sizeof(*p));
  if(p == NULL) {
      return NULL;
  }
  p->age = 10;
  p->code = 5090;
  return p;
}

内容的提问来源于stack exchange,提问作者Luigi_S_R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:54:06