具有C中的数组的结构的内存分配

时间:2012-07-25 11:37:13

标签: c

我有包含数组的结构。如下所示:

struct Node
{
    int a;
    char a1[25];
}obj;

main()
{
    struct Node *p = malloc(sizeof(struct Node));
    p->a=10;
}

我想知道是为这段代码分配了两个不同的内存部分,一个来自堆栈,用于存储结构节点,另一个来自堆,用于存储指针p所指向的节点?

4 个答案:

答案 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(与堆栈共享)分配的,而且根本没有堆(你需要一些内存管理模块才能使堆概念有意义)