
正文
c语言结构体在内存中会不会连续,c语言结构体中可以放函数吗
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
C语言分配动态内存,分配的是否只能是连续的内存?
1、malloc是C语言的分配内存接口,new操作会在分配内存的情况下再调用构造函数对内存块进行初始化,malloc和new都是从堆中分配内存,所以都不能保证分配的内存是连续的。
2、这个得看是编译器吧。C语言本身并没有规定struct的内存空间是否一定要连续,但是很多编译器比如VC、VS,在实现的时候,都是为struct分配连续的内存空间。
3、因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。3. realloc函数:函数原型为void *realloc(void *ptr, unsigned int size)重新定义所开辟内存空间的大小。
4、栈中的内存是操作系统自动分配的,可以理解成为时连续的,对中的内存分配是因为我们malloc空间的时候,申请的空间的大小不一样造成了碎片。
5、深究一下,为什么是这样,我们可以看看内存里的布局情况。a b c A的内存布局:1111, 1*, 11 b a c B的内存布局:1***, 1111, 11 其中星号*表示填充的字节。
6、int。 多次malloc 返回的地址是不保证连续的,每次的返回都只能容纳一个int。a[i]=i; 访问后面的第i个元素,但后面其实是没有东西的,非法访问来的。
相关问答
Q1: 结构体在内存中的存贮空间是连续的吗
结构体的成员在内存中不一定是连续存放的,因为要符合对齐要求,就有可能空出某些单元来。
这个得看是编译器吧。C语言本身并没有规定struct的内存空间是否一定要连续,但是很多编译器比如VC、VS,在实现的时候,都是为struct分配连续的内存空间。
结构体在内存中是一段连续的内存空间,BYTE缓存(即BYTE数组)也是一段连续的内存空间,直接进行内存拷贝就可以完成赋值操作。
, 11 * * * * * *, 1111* * * *, 11111111, 1111 i其实就是A的内存布局。i的起始位置要为8的倍数,所以h后面要补齐。把B的内存布局弄清楚,有关结构体的对齐方式基本就算掌握了。
不一定。编译器按照成员列表的顺序一个接一个地给每个成员分配内存。只 有当存储成员时需要满足正确的边界对齐要求时,成员之间才可能出现用于填充的额外内存空间。
Q2: c语言中为struct分配内存空间是否一定是连续空间?
第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
_me - 经理 四级 回答错误。不一定。编译器按照成员列表的顺序一个接一个地给每个成员分配内存。只 有当存储成员时需要满足正确的边界对齐要求时,成员之间才可能出现用于填充的额外内存空间。
不连续,结构体是按照一定的对齐方式存储在内存中的。
结构体的成员在内存中不一定是连续存放的,因为要符合对齐要求,就有可能空出某些单元来。
关于c语言结构体在内存中会不会连续和c语言结构体中可以放函数吗的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







