我在我的struct中有一个char *字段(name),我尝试通过p_update函数更新它,它什么都不返回(空白),那么如何更新char *?
#include <stdio.h>
//------------------------------------------
typedef struct{
char *name;
int age;
}person;
void p_info(person *);
void p_update(person *);
//------------------------------------------
int main(void){
person p1={"bob",22};
p_info(&p1);
p_update(&p1);
p_info(&p1);
return 0;
}
//------------------------------------------
void p_info(person *p){
printf("Name: %s\tAge: %i\n",p->name,p->age);
}
void p_update(person *p){
char name[10];
scanf("%9s",name);
p->name=name;
}
答案 0 :(得分:3)
那么如何更新char *?
你快到了。
而不是p->name=name;
使用strcpy
代替:
strcpy( p.name, name ); // Note use this with modified `person` struct below.
原因是您不能对字符串类型使用简单赋值 - 为此需要strcpy
和#include <string.h>
。
您的person
结构也需要处理,因为name
是未初始化的指针。最好使用数组。
typedef struct{
char name[10];
int age;
} person;
出于同样的原因,您需要声明并初始化您的结构,如下所示:
// person p1={"bob",22}; // <-- WRONG
person p1 = {};
strcpy(p1.name, "bob");
p1.age = 22;
如果坚持使用name
作为字符指针,那么在使用之前需要额外的步骤来分配内存。
在main()
:
// person p1={"bob",22}; // <-- WRONG
person p1 = {};
p1.name = malloc(20 * sizeof(char));
strcpy(p1.name, "bob");
p1.age = 22;
在p_update()
:
// p->name=name; // WRONG
p->name = malloc(20 * sizeof(char));
strcpy( p->name, name );
或者(正如pelya指出的那样),在这里使用单个strdup
会更容易,因为它等同于malloc
+ strcpy
p->name = strdup(name);
答案 1 :(得分:3)
id
完成后,p_update
将从内存中消失。您需要将其声明为全局变量,或者分配新的内存块:
char name[10];
或仅p->name = (char *) malloc(10); strcpy(p->name, name);
将结构缓冲区直接放在结构中会更容易:
p->name = strdup(name);