在结构中使用字符数组还是字符指针
2016-07-20 10:44
225 查看
声明一个数组有三种方法:
声明一个数组,声明时用常量表达式指定数组维数
声明一个变长数组,声明时用变量表达式指定数组位数(C99以后)
声明一个指针,调用malloc()分配合适的内存
使用第二种和第三中方法可以创建一个动态数组,即一个程序在运行时才分配内存并可选择数组的大小。
在结构中使用字符数组和字符指针存储字符串都是可行的,如下面的声明:
但是在声明结构变量和结构初始化时,可能会出现一些问题
sruct stu dent = {"taide", "S20160720"};
struct teac her = {"zhou", "T113469"};
这段代码可以正常运行,但是我们却不知道字符串存储在哪。对于struct stu 变量 dent 来说,字符串存储在结构内部,这个结构总共分配了 40 个字节来存放两个字符串。然而对于struct teac 变量 her来说,字符串存储在编译器存储字符串常量的任何地方。这个结构中存放的只是两个地址而已,它不为字符串分配任何存储空间,它只适用于管理那些已经创建的而且在程序中已经分配过空间的字符串。
对于dent ,名字 name有一个用来存放字符串的数组;对于teac ,gets( )把字符串放到由 her.name 给出的地址中。但是这是一个未经初始化的变量,该地址可能是任何值,程序就可以把名字放到任何地方。因此,如果需要一个结构来存储字符串,请尽量使用字符数组在结构中使用指针处理字符串的一个用意义的方法是使用
malloc ()分配内存,并用指针来存放地址。这个方法的优点是可以申请合适的空间,不至于浪费内存空间。
声明一个数组,声明时用常量表达式指定数组维数
声明一个变长数组,声明时用变量表达式指定数组位数(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);//释放内存
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 关于指针的一些事情
- 如何写好 C main 函数
- 注册表的组织结构
- IE7降低内存和降低CPU的几个技巧
- Ruby on Rails所构建的应用程序基本目录结构总结
- 如何高效的使用内存
- DOS下内存的配置
- Lua和C语言的交互详解
- XP/win2003下发现1G的内存比512M还慢的解决方法
- SQLSERVER的非聚集索引结构深度理解
- 调整SQLServer2000运行中数据库结构
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解
- c#结构和类的相关介绍
- C#中结构(struct)的部分初始化和完全初始化实例分析
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- C#中类与结构的区别实例分析
- C#枚举类型与结构类型实例解析