提问人:itsmarziparzi 提问时间:12/12/2022 最后编辑:trincotitsmarziparzi 更新时间:12/18/2022 访问量:132
当您不必使用所有数组时,是否可以在堆中创建一个大型数组?
Is it ok to create a large array in the heap when you aren't necessarily using all of it?
问:
因此,我正在研究一些编码面试类型问题的解决方案,并且结构中有一个数组
#define MAX_SIZE 1000000
typedef struct _heap {
int data[MAX_SIZE];
int heap_size;
}heap;
heap* init(heap* h) {
h = (heap*)malloc(sizeof(heap));
h->heap_size = 0;
return h;
}
这个堆结构后来是这样创建的
heap* max_heap = NULL;
max_heap = init(max_heap);
首先,我希望这是用 C++ 风格而不是 C 编写的,但其次,如果我只是对数组有所了解,我假设它相当于通过更改这样的代码来单独分析数组部分
int* data = NULL;
data = (int*)malloc(1000000 * sizeof(int));
现在在这种情况下,如果您可能只是使用一点点,那么声明具有最大大小的数组是否有任何问题?
我想这归结为一个问题,即当在堆中创建数组时,系统如何阻止内存的那部分?在哪种情况下,系统会阻止您访问属于阵列的内存?如果我不使用太多空间,我不会想要一个巨大的阵列来占用空间。
答:
0赞
chux - Reinstate Monica
12/12/2022
#1
如果您可能只是使用其中的一小部分,那么声明具有最大大小的数组是否有任何问题?
是的。分配大小越大,内存不足错误的风险就越大。如果不在这里,则在代码中的其他地方。
然而,一些内存分配系统可以很好地处理这个问题,因为真正的内存分配不会立即发生,而是在需要时稍后发生。
我想这归结为一个问题,即当在堆中创建数组时,系统如何阻止内存的那部分?
这是一个 C 未定义的实现定义问题。它可能会立即发生或推迟发生。
为了获得最大的可移植性,代码将采用更保守的方法,仅在需要时分配大型内存块,而不是依赖于以延迟方式发生的物理分配。
另类
在 C 中,考虑具有灵活成员数组的 a。struct
typedef struct _heap {
size_t heap_size;
int data[];
} heap;
下一个:将数据从文件读取到堆内存的函数
评论
std::vector
malloc
realloc
address space
physical memory
physical memory
address space
address space
physical memory