在堆栈或堆上初始化struct?

时间:2014-05-02 23:11:51

标签: c

如果您在C中有这样的结构:

struct mystruct{
        int i;
        char c;
};

你做了:

mystruct m;
m.i = 5;
m.c = 'i';

您是在堆上还是在堆栈上创建结构?

2 个答案:

答案 0 :(得分:4)

在筹码中:

void func()
{
    mystruct m;
    ...
}

// The address of 'm' is within the stack memory space

在堆中:

void func()
{
    mystruct* m = malloc(sizeof(mystruct));
    ...
}

// The value of 'm' is an address within the heap memory space

在数据部分:

mystruct m;

static mystruct m;

void func()
{
    static mystruct m;
    ...
}

// The address of 'm' is within the data-section memory space

在代码部分:

const mystruct m;

const static mystruct m;

void func()
{
    const mystruct m;
    ...
}

void func()
{
    const static mystruct m;
    ...
}

// The address of 'm' is within the code-section memory space

<强>更新

虽然与您的问题没有直接关系,但请注意const的上述规则并不完全准确,因为此关键字实际上有两个目的:

  1. 在程序的(只读)代码部分中分配变量。
  2. 阻止您(程序员)编写错误代码,例如在程序执行期间更改最初打算保持不变的变量值。
  3. 但是#1功能真的取决于你正在使用的编译器,它可能会将它放在别处,具体取决于你的项目配置。例如,有时您可能只想为功能#2声明一个常量变量,而功能#1由于代码段中的内存空间不足而不可行。

答案 1 :(得分:2)

堆栈。您必须使用malloc / calloc来创建堆变量。