简体   繁体   English

为结构类型初始化 malloc

[英]initialization of malloc for struct type

struct Person{
  char *name;
  int numb;
  char *var;
};

i have created a person above.我在上面创建了一个人。

struct Person *per1=malloc(sizeof(struct Person));
char per1_name[]="leo";
per1->name=malloc(strlen(per1_name)+1);
strcpy(per1->isim,per1_name);
per1->numb=12;
char per1_var[]="Twitter";
per1->var=malloc(strlen(per1_var)+1);
strcpy(per1->var,per1_var);

and i always initialize it like that as you can see it is so long, so is there any easy way for intialization of struct type that contains string?我总是这样初始化它,你可以看到它很长,那么有没有简单的方法来初始化包含字符串的结构类型?

you can use macro to simplify/shorten your code.您可以使用宏来简化/缩短您的代码。 Also you can use separate function which initializes your structure.您也可以使用单独的 function 来初始化您的结构。

struct Person{
  char *name;
  int numb;
  char *var;
};


#define MK_PERSON(per1, name, var, numb) \
struct Person *per1=malloc(sizeof(struct Person));\
per1->name=malloc(strlen(name)+1);\
strcpy(per1->name,name);\
per1->numb=numb;\
per1->var=malloc(strlen(var)+1);\
strcpy(per1->var,var);


struct Person * mk_person(const char *name, const char *var, int numb){
    struct Person *per1=malloc(sizeof(struct Person));
    per1->name=malloc(strlen(name)+1);
    strcpy(per1->name,name);
    per1->numb=numb;
    per1->var=malloc(strlen(var)+1);
    strcpy(per1->var,var);
    return per1;
}

int main(){

MK_PERSON(pers1, "Bob","m", 12);

struct Person *pers2 = mk_person("Mike", "m", 13);

}

this way you make/test and debug initialization only once and can use it safely later while being sure that everything is ok.这样,您只需进行一次/测试和调试初始化,以后就可以安全地使用它,同时确保一切正常。

I recommend to use function instead macro.我建议使用 function 代替宏。

You could write a function that initializes your struct:您可以编写一个 function 来初始化您的结构:

void InitializePerson(struct Person *person, const char* name, int number, const char* var)
{
  person->name = strdup(person);
  person->var = strdup(var);
  person->numb = number;
}

int main()
{
  struct Person* per1 = malloc(sizeof(struct Person));
  InitializePerson(per1, "leo", 12, "Twitter");
}

This is just one of many possibilities.这只是众多可能性之一。 Also note that there is no error checking whatsoever for brevity.另请注意,为简洁起见,没有任何错误检查。

if strdup is not available on your platform, you can write your own, it's basically 3 lines of code.如果strdup在您的平台上不可用,您可以自己编写,它基本上是 3 行代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM