C:malloc似乎分配更多然后我要求(数组)

时间:2013-02-17 16:14:58

标签: c arrays segmentation-fault malloc

您好我有这个问题: 为什么当我使用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

我哪里错了?

4 个答案:

答案 0 :(得分:5)

根据分配算法,分配的数量不会超出您的要求。但是,访问该内存是未定义的行为

答案 1 :(得分:4)

调用malloc时,可能会使用额外的空间来存储有关已分配块的元数据,例如其大小和有关其他已分配块的信息。有时,实现优选地将分配的块以特定间隔(例如,4或8字节的倍数)。但是,每次拨打malloc时,您都不应该依赖于一致的空间量;仅使用您特别要求的内容,或者您​​可能会覆盖其他重要信息。

有关详细信息,请参阅以下问题的答案:

答案 2 :(得分:1)

如果分配堆内存不属于特定的处理器规则,地址必须在长边,四边形或其他边界上对齐,我不会感到惊讶。

因此,如果您请求了100个字节的堆空间,则操作系统可能会返回超过您请求的数量,以满足处理器的对齐要求。但是,访问超过100个字节被认为是未定义的,并且可能并且可能会导致许多您不想要的奇怪行为。

答案 3 :(得分:1)

如果读取或写入错误page,则只能获得分段错误。页面通常为4KiB。

malloc()系统调用可能会保留比请求的空间更多的空间,并且它会在阻止记录的块之前保留一些内存,但是在访问{{1}时,您的程序不会被杀死并不意味着它没有在为它保留的块之外访问。它可能没有,操作系统只是没有注意到它。如果您在分配fk_array[15]后分配了另一个数组,那么您将有机会注意到它正在发生变化。