c语言中结构体在子函数中的用法
来源:互联网 发布:tcp网络编程 编辑:程序博客网 时间:2024/06/05 12:52
在c语言中,结构体是一种很常用的数据结构,但是要用好却又有许多疑惑。
假设下面这个是我们要用到的结构体
typedef struct DATA data;
struct DATA{
int *A;
data *next;
data *last;
}
首先来看一下这两个句子在子函数中的区别。
data * dt1=(data*)malloc(sizeof(data));
data* dt2;
读者可能要说没什么区别,都一样,但其实差别很大,用malloc申明的dt1,被放到堆内存中,当然堆也只是我们的定义,对内存本身来说并没有这种意义,dt2被放到栈中,当退出子函数的时候就会被撤销,这部分的内存值会是很随机的。
因此如果你要用到的数据希望不随子函数的结束而撤销,那么最好用malloc。
读者或许又有疑问了
编译器怎么知道DATA的大小呢;
其实编译器并不需要知道DATA的大小,或者说不管你DATA里面有什么数据结构,sizeof(dt1)都是一样的。
那么下面这两句话又是否一样呢;
sizeof(data);
sizeof(dt1);
读者可能要说当然一样啊,dt1就是data的实例啊,可是实际上并非如此。
首先我们知道一个指针的大小总是为4字节,所以dt1的sizeof也总是4
而data结构体的sizeof则会根据内部的变量数量输出大小。
好,现在又有一个新的问题,前面读者知道了要在子函数中创建一个结构体实例,并希望在主函数中使用需要用malloc,但只是这样就可以了吗
答案也是否定的,我们的结构体中有用到很多int型的指针,他们所指的数据也必须是malloc出来的数据,否则他们所指的数据在出子函数之后也会是
奇奇怪怪的数字。
在结构体中为什么不能创建另一个结构体变量而不是指针呢?
这个问题其实前面已经有暗示了,如果在结构体中用本结构体的变量,那么相当于一个递归,编译器永远不会知道一个结构体的大小,或者说结构体大小无穷大。
而用本结构体指针,不管是什么数据,反正你申明一个指针就是4字节,这个编译器还是没问题的。
- c语言中结构体在子函数中的用法
- c语言二维数组在子函数中的传址
- guidata在子函数中的运用和handles结构体
- C语言中结构体在函数中的应用
- C语言中结构体在函数中的应用
- C语言中结构体在函数中的应用 .
- C语言中结构体在函数中的应用
- 在汇编中引用C语言中的结构体
- C语言中结构体在函数中的应用
- C语言中结构体在函数中的应用
- C语言结构体中的冒号用法
- c++中new在子函数中的使用
- C语言在子函数中调用malloc申请内存的方法
- c语言结构体中的冒号的用法
- c语言结构体中的冒号的用法
- c语言结构体中的冒号的用法
- c/c++语言结构体中的冒号的用法
- c语言结构体中的冒号的用法
- .NET Framework 正则表达式
- Java核心技术--数组初始化和匿名数组
- jQuery-DatePicker 时间控制设置
- 实现尖角变圆角
- AI设计师“鲁班”进化史:每秒制作8000张双11海报,没有一张雷同!
- c语言中结构体在子函数中的用法
- 整理自《Pro Java 7 NIO.2》
- Python输出csv、excel表格
- C强制类型转换总结
- word文档加密经验实战分享
- getopt.h和getopt(),getopt_long()等函数
- .net集合对象解惑篇
- 突破自己,挑战10K
- 【51Nod1585】买邮票送邮票