在结构中使用字符数组还是字符指针

声明一个数组有三种方法:

  • 声明一个数组,声明时用常量表达式指定数组维数
  • 声明一个变长数组,声明时用变量表达式指定数组位数(C99以后)
  • 声明一个指针,调用malloc()分配合适的内存

使用第二种和第三中方法可以创建一个动态数组,即一个程序在运行时才分配内存并可选择数组的大小。

在结构中使用字符数组和字符指针存储字符串都是可行的,如下面的声明:

#define LEN 20
struct stu
{
    char name[LEN];
    char num[LEN];
}
struct teac
{
    char * name;
    char * num;
}

但是在声明结构变量和结构初始化时,可能会出现一些问题

sruct stu dent = {"taide", "S20160720"};

struct teac her = {"zhou", "T113469"};

这段代码可以正常运行,但是我们却不知道字符串存储在哪。对于struct stu 变量 dent 来说,字符串存储在结构内部,这个结构总共分配了 40 个字节来存放两个字符串。然而对于struct teac 变量 her来说,字符串存储在编译器存储字符串常量的任何地方。这个结构中存放的只是两个地址而已,它不字符串分配任何存储空间,它只适用于管理那些已经创建的而且在程序中已经分配过空间的字符串。

struct stu dent; 
struct teac her;
gets(dent.name);
gets(her.name);

对于dent ,名字 name有一个用来存放字符串的数组;对于teac ,gets( )把字符串放到由 her.name 给出的地址中。但是这是一个未初始化的变量,该地址可能是任何值,程序就可以把名字放到任何地方。因此,如果需要一个结构来存储字符串,请尽量使用字符数组在结构中使用指针处理字符串的一个用意义的方法是使用 malloc ()分配内存,并用指针来存放地址。这个方法的优点是可以申请合适的空间,不至于浪费内存空间。

char temp[20];
struct teac * her;
puts("input name of teacher:");
gets(temp);
her->name = (char *)malloc(strlen(temp) + 1);//分配存储name的内存
strcpy(her->name, temp);//把name复制到分配的内存中
free(her->name);//释放内存

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值