嗨,我有这个问题:为什么当我用malloc为浮点数组分配内存时,它会分配我请求的更多空间?例如,在这段代码中,我试图分配一个十个"单元格"的浮动数组,但如果我试图访问其他单元格,它不会返回segfault错误:
#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("%fn",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
我哪里错了??
根据分配算法,分配的数量不太可能超过您的请求。但是,访问该内存是未定义的行为。
调用malloc
时,可能会使用额外的空间来存储有关所分配块的元数据,例如其大小和有关其他已分配块的信息。有时,实现方式更喜欢以特定间隔(例如,4或8字节的倍数)分配块。但是,您不应该依赖于每次调用malloc
时空间大小的一致性;只使用您特别要求的内容,否则可能会覆盖其他重要信息。
有关更多信息,请参阅以下问题的答案:
- free和malloc在C中是如何工作的
- 为什么malloc分配的字节数与请求的不同
如果分配堆内存不属于特定的处理器规则,即地址必须在长边界、四边形边界或其他边界上对齐,我不会感到惊讶。
因此,如果您请求了100字节的堆空间,操作系统可能会返回比您请求的更多的堆空间来满足处理器的对齐要求。然而,访问超过100个字节被认为是未定义的,并且可能会导致许多您不想要的奇怪行为。
只有当读或写错误的页面时,才会出现分段错误。一个页面通常是4KiB。
malloc()
系统调用可能会保留比请求更多的空间,并且它在块之前保留了几个字的内存用于记账,但您的程序在访问fk_array[15]
时没有被杀死并不意味着它没有访问为其保留的块之外。它可能已经访问了,操作系统只是没有注意到。如果您在分配fk_array
之后分配了另一个数组,你会有机会注意到它正在改变。