了解malloc()

时间:2014-07-05 21:05:22

标签: c malloc heap

void fillArray(int* array, int len) {
    printf("Filling an array at address %p with %d "
            "values\n", array, len);
    int i=0;
    for (i = 0; i < len; ++i) {
        array[i] = i * 3 + 2;

        // assert() verifies that the given condition is true
        // and exits the program otherwise. This is just a
        // "sanity check" to make sure that the line of code
        // above is doing what we intend.

        assert(array[i] == i * 3 + 2);
    }
    printf("Done!\n");
}

typedef struct {
    int a, b, c, d;
}   FourInts;

下面的代码写在main函数中。当我将heap_fourints指针转换为char *时,我无法理解为什么编译器没有给出错误或程序由于断言而停止。

FourInts* heap_fourints=malloc(sizeof(FourInts) * 4);
fillArray( (char*) heap_fourints,4);
assert((*heap_fourints).a == 2);
assert(heap_fourints->b == 5);
assert(heap_fourints->c == 8);
assert(heap_fourints->d == 11);

我认为这是正确的实施方式。

FourInts* heap_fourints=malloc(sizeof(ints) * 4);
fillArray( (ints*) heap_fourints,4);
assert((*heap_fourints).a == 2);
assert(heap_fourints->b == 5);
assert(heap_fourints->c == 8);
assert(heap_fourints->d == 11);

1 个答案:

答案 0 :(得分:3)

FourInts* heap_fourints=malloc(sizeof(FourInts) * 4);

这将分配足够的内存来保存结构的4个副本(每个副本足以容纳4个整数),这是一个足够至少 16个整数的内存。虽然你没有使用所有这些内存,但你从来没有读/写,所以运行时很快(没有内存损坏)。

OTOH

FourInts* heap_fourints=malloc(sizeof(int) * 4); // int, not ints(!)

将分配足够的内存来保存 4 int 值。注意:这不是必然意味着由于可能的对齐填充(但在int的情况下不太可能),该存储器足以保持具有4个整数的结构。

但是又一次 - 在你的平台上,你的第二个代码也没有违反内存。

至于编译错误,或者说缺乏编译错误。 C不像其他人那样强类型语言(例如C++),并且指针转换的规则有些放松。由一种类型的变量指向的存储器可以自由转换到不同的类型。这是非常危险的(并且是气馁的),当然它有其用途。特别是在处理极低级代码时