假设我有一个表示虚拟机的结构。请查看我的init()
方法。在init()
方法中,我在堆中为虚拟机的状态分配一些空间。但是,有些事情似乎不对。我首先为我的state(struct(分配空间,然后为RAM(int类型的数组(分配空间。RAM已经在我的struct中了。没事吧?或者我做错了什么?
我的问题是如何为堆中结构内部的数组分配内存。
typedef struct {
int* ram;
int pc;
} vm_t;
vm_t* init(int ram_size)
{
vm_t* vm = (vm_t*)malloc(sizeof(vm_t));
vm->ram = (int*)malloc(ram_size * sizeof(int));
vm->pc = 0;
return vm;
}
我会用不同的方式来做。只需要一个malloc和free。
typedef struct {
size_t pc;
int ram[];
} vm_t;
vm_t* init(size_t ram_size)
{
vm_t *vm = malloc(sizeof(*vm) + ram_size * sizeof(vm -> ram[0]));
if(vm)
vm -> pc = 0;
return vm;
}
注意:尺寸使用size_t
,总是检查malloc
的结果。使用对象而不是sizeof
中的类型。当您更改类型时,内存分配将不必更改。
我不知道为什么RAM有int
类型,但这在这个问题上并不重要。
编辑。如何访问。示例如何读取ram
int read_RAM(vm_t *vm, size_t address)
{
return vm -> ram[address];
}
int read_RAM1(vm_t *vm, size_t address)
{
return *(vm -> ram + address);
}