再识C中的结构体
在前面认识C中的结构体中我介绍了结构体的基础知识,下面通过这段代码来回顾一下:
#include<stdio.h>
#define LEN 20 struct Student{ //定义结构体
char name[LEN];
char address[LEN];
int age;
}; int main(int argc, char* argv[])
{
struct Student s = { //初始化
"bluemsun","NENU",
}; struct Student * p; //定义一个指向结构体的指针
p = &s; //为指针赋值 printf("s.name = %s,s.address = %s,s.age = %d\n",s.name,s.address,s.age);
printf("p->name = %s,p->address = %s,p->age = %d\n",p->name,p->address,p->age);
}
这是一个比较简单的例子程序,在结构体Student中我们定义两个char数组,现在来考虑这样一个问题。我们在平时需要使用数组的时候都是可以用指针代替数组作为参数使用,那么在上面的程序中能否用下面这段代码代替结构体的定义呢?
struct new_Student{ //定义结构体
char * name;
char * address;
int age;
};
答案是肯定的,但是可能会遇到一些麻烦。考虑下面一段代码:
struct new_Student s1 = {"zhouxy","EFGH",};
struct Student s2 = {"bluemsun","ABCD",};
这段代码是正确的。但是想想其中的字符串存储在哪里?对于struct Student变量s2来说,字符串存储在结构内部,这个结构总共分配了40个字节来存储两个字符串。然而对于new_Student变量s1来说,字符串是存放在编译器存储字符串常量的任何地方。new_Student结构中仅仅是存放了两个地址而已。所以如果需要一个结构来存放字符串,请使用字符数组成员。那么是不是采用指针的方式就真的不能完成内存的分配呢?答案是否定的。在这里我讲解了关于C中的函数malloc(),这个函数是可以在运行期动态分配内存的。所以如果能结合在这里来使用,那就达到了我们的设想了。考虑下面这段代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h> struct new_Student{ //定义结构体
char * name;
char * address;
int age;
}; int main(int argc, char* argv[])
{
char str[] = "zhouxy";
struct new_Student s1;
//分配用来存放名字的内存
s1.name = (char*)malloc(strlen(str)+);
//把名字复制到已分配的内存中
strcpy(s1.name,str); printf("s1.name = %s\n",s1.name);
}
上面代码是正确的,我们用malloc()函数分配存储空间,然后把字符串复制到新分配的空间。这里要理解的是:name字符串不是被存储在结构中,而是被保存在由malloc()函数管理的内存中。结构中仅仅是保存了name字符串的地址而已。还有一点要记得的是:我们使用malloc()函数分配内存之后要调用free()函数,不然可能会引起"内存泄露"。
再识C中的结构体的更多相关文章
- C语言中的结构体
用户自己建立自己的结构体类型 1. 定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...
- 关于C语言中结构体中的结构体成员导致的字节对齐问题
关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...
- C++中的结构体的认识
C++中的结构体的认识 1. typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间. 实例像:typedef ...
- x264中重要结构体参数解释,参数设置,函数说明 <转>
x264中重要结构体参数解释http://www.usr.cc/thread-51995-1-3.htmlx264参数设置http://www.usr.cc/thread-51996-1-3.html ...
- [转]C#中的结构体与类的区别
C#中的结构体与类的区别 经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字cla ...
- Go中的结构体
前面我们或多或少的都使用了结构体这种数据结构,本身结构体也有很多特性,我们一一来看. 结构体的作用是将一个或者多个任一类型的变量组合在一起的数据类型,类似于我们在Java中class的作用.在结构体重 ...
- C++中的结构体
http://zhidao.baidu.com/link?url=8OYQSKV9mvSBc6Hkf9NsLQmipSge9VCZDJQGAZZs5PCBQ54UTmK98VRmAklEEAFYu7d ...
- C/C++中的结构体
结构体定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构. 结构体作用 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成 ...
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
随机推荐
- 类似于QQ游戏百万人同时在线的服务器架构实现
http://blog.csdn.net/sodme/article/details/213995 —————————————————————————————————————————————————— ...
- hibernate里createSQLQuery的addEntity()和setResultTransformer()方法
http://langgufu.iteye.com/blog/1565397 ————————————————————————————————————————————————————————————— ...
- [翻译]创建ASP.NET WebApi RESTful 服务(9)
一旦成功的发布API后,使用者将依赖于你所提供的服务.但是变更总是无法避免的,因此谨慎的制定ASP.NET Web API的版本策略就变得非常重要.一般来说,新的功能需要无缝的接入,有时新老版本需要并 ...
- HDU 2859 Phalanx (dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 给你一个n*n的矩阵,问你最大的对称度是多少(左下右上为对称线) dp[i][j]表示i行j列元 ...
- stl map高效遍历删除的方法 [转]
for(:iter!=mapStudent.end():) { if((iter->second)>=aa) { //满足删除条件,删除当前结点,并指 ...
- c\c++ 字符串处理大集合[转]
rember this strncpy(a,b,); a[]='\0'; ]; memset(a,'#',sizeof(a)); a[]='\0'; 刚开始学C/C++时,一直对字符串处理函数一知半解 ...
- Docker 入门教程
几个月以前,红帽(Red Hat)宣布了在 Docker 技术上和 dotCloud 建立合作关系.在那时候,我并没有时间去学习关于 Docker 的知识,所以在今天,趁着这个 30 天的挑战,我决定 ...
- mac 开发必备软件(不断update ing...)
整理下mac环境下, 开发必备的一些软件吧, 由于不断要更新ing, 用到啥就写啥~球轻拍 1.host 绑定切换神器 a.gas mask : 只能切换单个自定义的host文件 b.ihosts(推 ...
- 用java写一个web服务器
一.超文本传输协议 Web服务器和浏览器通过HTTP协议在Internet上发送和接收消息.HTTP协议是一种请求-应答式的协议——客户端发送一个请求,服务器返回该请求的应答.HTTP协议使用可靠的T ...
- 【转】Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用]
Fresco简单的使用—SimpleDraweeView 百学须先立志—学前须知: 在我们平时加载图片(不管是下载还是加载本地图片…..)的时候,我们经常会遇到这样一个需求,那就是当图片正在加载时应该 ...