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);
答案 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++
),并且指针转换的规则有些放松。由一种类型的变量指向的存储器可以自由转换到不同的类型。这是非常危险的(并且是气馁的),当然它有其用途。特别是在处理极低级代码时