c - 是否可以修改函数内结构体指针的内容?

标签 c pointers struct pass-by-reference function-declaration

我是C初学者,我试图创建一个修改结构体指针内容的函数,但没成功,内容保持不变。

这是我的代码:

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

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

void enter(person *struct_pointer);

void main(void)
{
  person *person_1 = NULL;

  enter(person_1);
  printf("CODE: %i\n", person_1->code);
  free(person_1);
}

void enter(person *struct_pointer)
{
 struct_pointer = malloc(sizeof(*struct_pointer));
 struct_pointer->age = 10;
 struct_pointer->code = 5090;
}

在上面的示例中,当我打印 person_1 的代码时,它没有打印任何内容,所以我认为这是因为 person_1 仍然指向 NULL。

有人可以解释一下我该如何做到这一点,如果不能做到的话为什么。

谢谢

最佳答案

要更改函数中的对象(指针是对象),您需要通过引用将其传递给函数。

在 C 语言中,通过引用传递意味着通过指向对象的指针间接传递对象。因此,取消引用指针后,函数可以直接访问原始对象。

所以你的函数应该按以下方式声明和定义

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

并称其为

enter( &person_1 );

否则在此函数声明的情况下

void enter(person *struct_pointer);

该函数将处理所传递指针值的副本,并且在函数内更改副本不会影响原始指针。

注意,根据C标准,不带参数的函数main应该这样声明

int main( void )

关于c - 是否可以修改函数内结构体指针的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70175909/

相关文章:

c - 结构体和结构体指针之间的区别

c - make 在编译和链接 C 程序时忽略 -std=c99 标志

c++ - 'void *' to ' void (*) (bool)' 使用 C++ 编译器在 C 中编译文件的指针错误

c - 内存泄漏和可能的 malloc 错误

c++ - 在 C++ 中打印一个简单的链表,数据结构

c# - 使用反射获取结构中的结构

c - 将数组元素添加到结构中的数组

c - malloc 内存中的数据损坏

string - 在 Go 中打印 bytes.Buffer 时的不同行为

php - Parse.com - Parse PHP SDK - 如何通过指针字段查询数据?