c语言中结构体在子函数中的用法

在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语言)