您好我有这个问题: 为什么当我使用malloc为float数组分配内存时,它会分配更多我要求的空间? 例如,在这段代码中我试图分配一个十个“单元格”浮点数组,但如果我尝试访问其他单元格,则返回我没有段错误:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
float *fk_array;
int main(int argc, char** argv){
fk_array = (float *) malloc(10 * sizeof(float));
int i;
fk_array[9] = 2.23;
fk_array[15] = 0.3;
for(i = 0; i<20 ; i++)
printf("%f\n",fk_array[i]);
free(fk_array);
return 1;
}
它让我回复:
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
2.230000
0.000000
0.000000
0.000000
0.000000
0.000000
0.300000
0.000000
0.000000
0.000000
0.000000
我哪里错了?
答案 0 :(得分:5)
根据分配算法,分配的数量不会超出您的要求。但是,访问该内存是未定义的行为。
答案 1 :(得分:4)
调用malloc
时,可能会使用额外的空间来存储有关已分配块的元数据,例如其大小和有关其他已分配块的信息。有时,实现优选地将分配的块以特定间隔(例如,4或8字节的倍数)。但是,每次拨打malloc
时,您都不应该依赖于一致的空间量;仅使用您特别要求的内容,或者您可能会覆盖其他重要信息。
有关详细信息,请参阅以下问题的答案:
答案 2 :(得分:1)
如果分配堆内存不属于特定的处理器规则,地址必须在长边,四边形或其他边界上对齐,我不会感到惊讶。
因此,如果您请求了100个字节的堆空间,则操作系统可能会返回超过您请求的数量,以满足处理器的对齐要求。但是,访问超过100个字节被认为是未定义的,并且可能并且可能会导致许多您不想要的奇怪行为。
答案 3 :(得分:1)
如果读取或写入错误page,则只能获得分段错误。页面通常为4KiB。
malloc()
系统调用可能会保留比请求的空间更多的空间,并且它会在阻止记录的块之前保留一些内存,但是在访问{{1}时,您的程序不会被杀死并不意味着它没有在为它保留的块之外访问。它可能没有,操作系统只是没有注意到它。如果您在分配fk_array[15]
后分配了另一个数组,那么您将有机会注意到它正在发生变化。