C语言,结构体中字符串的声明(采用字符指针还是字符数组)

      结构体中,字符串选项是用字符数组表示好,还是用字符指针表示好?

 

typedef struct person{
	char *name;
	int age;
	char sex[6];
};


      该结构体中name用的是指针而不是数组,所以需要给字符串在堆上申请内存然后再赋值;sex字符串用的是字符数组,因此可以给其赋值;

 

      用字符指针的优势是:字符指针不会限制字符串的大小。如果用字符数组,需要提前决定字符串的长度。

      上面的结构体中,name的值可以设无限长(前提时,要在堆上申请内存),而sex的字符串长度不能超过6。

 

下面是结构体对象创建的过程:

 

man* creat(char *name, int age, char *sex)
{
	man *i = malloc(sizeof(man));
	i->name = strdup(name);
	i->age = age;
	i->sex = sex;
	
	return i;
}

strdup()函数会计算出字符串的长度,然后调用malloc函数在堆上申请相应的空间,最后把字符串的所有字符复制到堆上。

 

我们也可以在strdup()函数的基础上,实现一个有错误提示的strdup()函数

 

char * safe_strdup(const char *s) 
{
    char * retval = NULL;
    if (!s) 
    {
        debug(LOG_CRIT, "safe_strdup called with NULL which would have crashed strdup. Bailing out");
        exit(1);
    }
    retval = strdup(s);
    if (!retval) 
    {
        debug(LOG_CRIT, "Failed to duplicate a string: %s.  Bailing out", strerror(errno));
        exit(1);
    }
    return (retval);
}

 

对象创建的函数也可以随之做些更改:

 

man* creat(char *name, int age, char *sex)
{
	man *i = malloc(sizeof(man));
	i->name = safe_strdup(name);
	i->age = age;
	i->sex = sex;
	
	return i;
}

 

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C语言结构体,是可以使用动态字符串数组的。一种实现方法是使用指针和动态内存分配函数(如malloc、calloc等)来创建一个指向字符串指针数组,然后在需要的时候动态地分配内存来存储字符串。下面是一个示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 50 typedef struct { char **names; int num_names; } Person; void add_name(Person *p, char *name) { p->num_names++; p->names = realloc(p->names, sizeof(char *) * p->num_names); p->names[p->num_names - 1] = malloc(sizeof(char) * (strlen(name) + 1)); strcpy(p->names[p->num_names - 1], name); } int main() { Person p; p.names = NULL; p.num_names = 0; add_name(&p, "John"); add_name(&p, "Mary"); add_name(&p, "Tom"); for (int i = 0; i < p.num_names; i++) { printf("Name %d: %s\n", i + 1, p.names[i]); } for (int i = 0; i < p.num_names; i++) { free(p.names[i]); } free(p.names); return 0; } ``` 在上面的代码,我们定义了一个名为Person的结构体,其包含一个char类型的指针指向字符串数组,以及一个int类型的变量表示数组字符串的数量。我们定义了一个add_name函数,用于向字符串数组添加新的字符串。这个函数首先将num_names加1,然后使用realloc函数重新分配names指针数组的内存空间,以便能够存储更多的指向字符串指针。接下来,它使用malloc函数为新字符串分配内存,并使用strcpy函数将字符串复制到新分配的内存。在主函数,我们使用add_name函数向Person结构体添加了三个字符串,然后使用for循环打印出每个字符串。最后,我们使用for循环和free函数释放了动态分配的内存。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值