我有包含数组的结构。如下所示:
struct Node
{
int a;
char a1[25];
}obj;
main()
{
struct Node *p = malloc(sizeof(struct Node));
p->a=10;
}
我想知道是为这段代码分配了两个不同的内存部分,一个来自堆栈,用于存储结构节点,另一个来自堆,用于存储指针p
所指向的节点?
答案 0 :(得分:3)
此处没有数组的堆栈分配。 struct Node
内的数组存储在堆上的连续块中。您可以通过打印sizeof(struct Node)
来看到这一点,它至少相等:
sizeof(int) + sizeof(char) * 25
答案 1 :(得分:3)
p
是具有自动存储持续时间的对象;它的存储在大多数编译器的堆栈中。
指向具有分配存储持续时间的结构对象;这个结构对象的存储在大多数编译器的堆中。
答案 2 :(得分:1)
编辑后:
struct Node
{
int a;
char a1[25];
}obj;
相反,我会在数据部分分配它。这段代码被修改为像
一样#include <stdio.h>
#include <stdlib.h>
struct Node
{
int a;
char a1[25];
}obj;
int global_data;
int main()
{
// struct Node *p = malloc(sizeof(struct Node));
// p->a=10;
obj.a = 10;
return 0;
}
当我们查看汇编代码时。
.file "ada.c"
.comm obj,32,32
.comm global_data,4,4
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
global_data和obj都分配在同一位置。即未初始化的数据部分。堆中没有机会分配。因为没有调用malloc()。
答案 3 :(得分:0)
您应该注意到您只是声明了一个结构(struct Node)。
通过声明它,实际上没有为它保留任何内存。您只是告知编译器存在这样的数据组织。
当你打电话给malloc时,只有你保留一些记忆来做任何事情。
现在,如果您要声明:
struct Node{
.....
}myNode;
在这种情况下,确实会为myNode分配内存空间。
要回答你的后续问题,它不会在堆栈或堆中分配。
随着内存分配,堆会增长。 堆栈可以随本地变量一起增长。这是全局变量,其大小不会改变,因此可以放在内存中的固定位置,称为数据段。
这也是存储静态变量的地方。
为了更深入地了解这个主题,当您使用Windows或Linux等操作系统时,在程序运行之前,它会被复制到RAM内存中的某个位置。其中一部分将被称为代码段,其中只读取代码,部分是数据段,这是该变量所在的位置。程序可以访问的其余RAM对于堆和堆栈是免费的。
在没有OS的嵌入式系统上,程序直接从Flash运行,因此其代码段在Flash中编程。它的数据段是为可用的RAM(与堆栈共享)分配的,而且根本没有堆(你需要一些内存管理模块才能使堆概念有意义)