是否可以在函数内修改结构指针的内容?
Is it possible to modify the content of a struct pointer inside a function?
我是 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。
谁能解释一下我该怎么做,如果做不到为什么。
谢谢
您可以修改结构的内容。它对您不起作用,因为您是在 enter
函数中创建一个新结构而不是编辑原始结构。只需删除第一行(带有 malloc
的行),而是在 person_1
变量的声明中分配结构。
要更改函数中的对象(指针是对象),您需要通过引用将其传递给函数。
在 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 初学者,我试图创建一个修改结构指针内容的函数,但它无法实现,相反,内容保持不变。
这是我的代码:
#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。
谁能解释一下我该怎么做,如果做不到为什么。
谢谢
您可以修改结构的内容。它对您不起作用,因为您是在 enter
函数中创建一个新结构而不是编辑原始结构。只需删除第一行(带有 malloc
的行),而是在 person_1
变量的声明中分配结构。
要更改函数中的对象(指针是对象),您需要通过引用将其传递给函数。
在 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 )