1

您好我有这个问题:为什么当我使用 malloc 为浮点数组分配内存时,它分配了我请求的更多空间?例如,在这段代码中,我试图分配一个十个“单元格”浮点数组,但如果我尝试访问其他单元格,它不会返回任何段错误错误:

#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

4 回答 4

5

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

于 2013-02-17T16:16:35.563 回答
4

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

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

于 2013-02-17T16:25:04.417 回答
1

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

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

于 2013-02-17T16:30:32.943 回答
1

如果读取或写入位于错误的页面中,您只能得到分段错误。一页通常为 4KiB。

系统调用可能会保留比请求多一点的malloc()空间,它会在块之前保留几个字的内存用于记账,但是你的程序在访问时没有被杀死fk_array[15]并不意味着它没有在保留的块之外访问为了它。它可能确实如此,操作系统只是没有注意到它。如果您在分配 之后分配了另一个数组fk_array,您将有机会注意到它正在发生变化。

于 2013-02-17T17:25:21.313 回答