结构体存储不连续?请问结构体分配内存为什么不连续

经验攻略 bvnghjyi7692 2024-04-19 17:05 2 0

一、结构体和数组有什么不同呢

数组与结构体的主要区别如下:

1、定义不同

数组是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量;

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。

2、数据类型不同

数组是相同类型元素(元素可以是原子类型的整型、浮点型、字符型或者结构体、数组等)的集合;

结构体是不同类型元素(元素可以是原子类型的整型、浮点型、字符型或者结构体、数组等)的集合。

3、调用方式不同

数组可以直接利用下标访问;

而结构体必须使用结构中成员的变量名。

参考资料来源:百度百科-数组

参考资料来源:百度百科-结构体

二、链式存储设计结点内的存储单元地址为什么要连续

链式存储设计时,各个不同结点的存储空间可以不连续,但是结点内的存储单元地址则必须连续。

typedef struct LNode{

int value;// value中存放结点值域,默认是int型

struct Lnode*next;//指向后继结点的指针

}LNode;//定义单链表结点类型

上述定义了一个结构体,包括两部分,一是值域,二是指针域;每当定义一个结点都会产生这两个区域。

这个value与next域必须是挨着的,称这个结点为内部。

假如我们定义若干个不同的结点,把它们连接起来成为一个单链表。

value区域,箭头区域则是指针域指向逻辑上相链接的下一个结点,但是它们在空间上不一定连续。

而对于它们的结点内部一定是连续的。若第一个结点占用两个地址,那么value域的起始地址是1,则指针域的地址就是2。同理若第二个结点的value地址是10,则next域就是11。

因此,在进行链式存储设计时,各个不同结点完全可以存储在不连续的空间上,而对于同一个结点内部,不论划分多少个区域,两个也好,三个也罢,总之内部的单元存储地址是连续的。

三、共用体和结构体的区别

一、变量长度不同

结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。

共用体变量所占的内存长度等于最长的成员的长度。

二、占用空间不同

结构体是同时存在的,并一次占用一段连续的内存空间;

而共用体则是多个共用成员占用同一个开始的内存地址,同时他们只能存在一各,所以空间大小就是最大那个所需的空间,如果单从一个共用体来讲,我们是不知道里面存的是什么内容,需要根据程序上下文才能确定。

三、分配储存空间不同

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,简称结构。在C语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体来使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。

结构体类型的定义只是由用户构造了一个结构体,但定义结构体类型时系统并不为其分配存储空间。

参考资料来源:百度百科-c++共用体

参考资料来源:百度百科-结构体

四、请问结构体分配内存为什么不连续

malloc是指在堆上分配的内存,所以称为动态内存分配

这些内存是由链表结构连接起来的,并且内存大小都不一样

比如,现在有5块内存,大小分别为44字节、19字节、5字节、65字节、14字节,然后他们用链表结构连接起来

首先我要强调的是(最初)这些内存的地址是连续的,如果这时你要动态申请内存并且申请内存的大小为44字节,通过你的malloc指令系统会自动从链表由上到下搜索,这是会发现只有第一块和第四块内存满足我的要求,然后系统调用,并且第五块多余的21字节会被系统重新收回并且保存在链表结构里,这就导致了他们地址的不连续性,同时也导致了内存碎片的产生,亦成为”动态“。

为什么数组申请内存就是连续的呢?比如int

a[2],

b[2];会发现他们的地址是连续的

原因是他们是从栈内存上分配的,跟堆是完全两个概念,你可以搜索有关资料了解。