无意侵权:http://www.cnblogs.com/zhouxuanyu/p/4514754.html

再识C中的结构体

  在前面认识C中的结构体中我介绍了结构体的基础知识,下面通过这段代码来回顾一下:

 1 #include<stdio.h>2 #define LEN 203 4 struct Student{            //定义结构体5     char name[LEN];6     char address[LEN];7     int age;8 };9
10 int main(int argc, char* argv[])
11 {
12     struct Student s = {        //初始化
13         "bluemsun","NENU",25
14     };
15
16     struct Student * p;            //定义一个指向结构体的指针
17     p = &s;                        //为指针赋值
18
19     printf("s.name = %s,s.address = %s,s.age = %d\n",s.name,s.address,s.age);
20     printf("p->name = %s,p->address = %s,p->age = %d\n",p->name,p->address,p->age);
21 }

  这是一个比较简单的例子程序,在结构体Student中我们定义两个char数组,现在来考虑这样一个问题。我们在平时需要使用数组的时候都是可以用指针代替数组作为参数使用,那么在上面的程序中能否用下面这段代码代替结构体的定义呢?

1 struct new_Student{            //定义结构体
2     char * name;
3     char * address;
4     int age;
5 };

  答案是肯定的,但是可能会遇到一些麻烦。考虑下面一段代码:

1 struct new_Student s1 = {"zhouxy","EFGH",25};
2 struct Student s2 = {"bluemsun","ABCD",26};    

  这段代码是正确的。但是想想其中的字符串存储在哪里?对于struct Student变量s2来说,字符串存储在结构内部,这个结构总共分配了40个字节来存储两个字符串。然而对于new_Student变量s1来说,字符串是存放在编译器存储字符串常量的任何地方。new_Student结构中仅仅是存放了两个地址而已。所以如果需要一个结构来存放字符串,请使用字符数组成员。那么是不是采用指针的方式就真的不能完成内存的分配呢?答案是否定的。在这里我讲解了关于C中的函数malloc(),这个函数是可以在运行期动态分配内存的。所以如果能结合在这里来使用,那就达到了我们的设想了。考虑下面这段代码:

 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 5 struct new_Student{            //定义结构体6     char * name;7     char * address;8     int age;9 };
10
11 int main(int argc, char* argv[])
12 {
13     char str[] = "zhouxy";
14     struct new_Student s1;
15     //分配用来存放名字的内存
16     s1.name = (char*)malloc(strlen(str)+1);
17     //把名字复制到已分配的内存中
18     strcpy(s1.name,str);
19
20     printf("s1.name = %s\n",s1.name);
21 }

  上面代码是正确的,我们用malloc()函数分配存储空间,然后把字符串复制到新分配的空间。这里要理解的是:name字符串不是被存储在结构中,而是被保存在由malloc()函数管理的内存中。结构中仅仅是保存了name字符串的地址而已。还有一点要记得的是:我们使用malloc()函数分配内存之后要调用free()函数,不然可能会引起"内存泄露"。

不足之处,还请多多指教。转载请注明出处!

转载于:https://www.cnblogs.com/yayizi/p/4524744.html

C语言之结构体(2)相关推荐

  1. C 语言编程 — 结构体的数据类型转换

    目录 文章目录 目录 数组类型强制类型转换为结构体 结构体之间的强制类型转换 数组类型强制类型转换为结构体 先看一个例子: #include <stdio.h>int main(void) ...

  2. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 在上一篇博客 [C 语言]结构体 ( 结构体 数 ...

  3. 【剑仙教程】易语言的结构体。自定义数据类型。

    1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言 ...

  4. C 语言中结构体强制转换--实验

    2019独角兽企业重金招聘Python工程师标准>>> 对于C语言中结构体强制转换做了如下实验, 或许可以解惑一些问题 对于结构体, 我理解的属性有: 成员的顺序, 成员的类型,成员 ...

  5. java接收c语言的结构体

    java接收c语言的结构体 DataInputStream inputStream = new DataInputStream(s.getInputStream()); int read = 0; i ...

  6. c语言常量结构体的成员,c语言之结构体

    c语言之结构体 1.结构体基础知识 C语言提供了两种类型的聚合数据类型(能够同时存储超过一个的单独数据),数组和结构.数则是相同类型的元素的集合,而结构也是一些值的集合,这些值称为它的成员,单一个结构 ...

  7. java发送c语言结构体_C语言中结构体直接赋值?

    在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...

  8. c 语言 结构体 编程,C语言:结构体的编程问题(很简单)

    C语言:结构体的编程问题(很简单) 答案:2  信息版本:手机版 解决时间 2020-07-25 02:18 已解决 2020-07-24 02:27 先定义一个结构体Student,它包含四个成员: ...

  9. c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配

    #include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...

  10. 一起学习C语言:结构体(二)

    上一篇<一起学习C语言:结构体(一)> 中,我们了解了结构体的概念与定义形式,以及结构体变量初始化赋值.本章节,我们分析结构体成员访问形式,以及结构数组使用的场景. 章节预览: 4. 结构 ...

最新文章

  1. php跟html增删改查,EasyUIDataGrid结合ThinkPHP实现增删改查操作初学者_html/css_WEB-ITnose...
  2. HotSpotOverview.pdf
  3. php7连接mongodb,批量添加数据
  4. Sharepoin学习笔记—架构系列--04 Sharepoint的四种执行模型 1
  5. AI赋能红外测温助力精准防控疫情……
  6. 服务器不稳定 如何让百度重新收录网站,教你如何让百度重新收录首页
  7. 2017.3.15 余数之和sum 失败总结
  8. 窄带物联网技术有望终结碎片化现状
  9. JS+dom简单运动实现
  10. zzbower入门教程
  11. Windows Server 2008群集仲裁机制
  12. 网络工程制图论文计算机,工程制图论文.doc
  13. 用python的OCR实现自动拍照搜题
  14. 谢尔宾斯基三角形:Python+turtle
  15. python创意网络爬虫_Python网络爬虫(一)
  16. 用实际例子理解回调函数(Calback)
  17. 滴滴单通道语音分离与目标说话人提取和抑制技术进展
  18. 请问这个验证码是怎么做的?
  19. 2021年最新易支付修复版源码支持微信支付宝官方接口和码支付网信钱包等/个人也能用的易支付商户系统
  20. PIPIOJ 1004: 惠民工程

热门文章

  1. Web前端笔记(7)
  2. 森林图怎么分析_新疆森林消防总队特勤大队:“火焰蓝”备战春防,我们时刻准备着!...
  3. sort redis php,php-redis中的sort排序函数总结
  4. 树莓派该文件名_树莓派的20个常用命令
  5. micropython mqtt 重连_ESP32/ESP8266使用MicroPython利用MQTT发布DHT11/DHT22传感器数据
  6. python raise用处_python基础教程python raise的基本使用
  7. Pytest之参数化
  8. 记一次坑爹报错之旅 -bash: /etc/profile: line 11: syntax error near unexpected token
  9. SAP License:自动创建带内部订单预算管控的在建工程
  10. SAP License:CO-第四夜-产品成本核算