理解malloc() 我认为这是正确的实现。 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);

理解malloc() 我认为这是正确的实现。 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);,c,malloc,heap,C,Malloc,Heap,这将分配足够的内存来保存结构的4个副本(每个副本足以保存4个整数),这是一个至少可以保存16个整数的内存。虽然您没有使用所有这些内存,但您从未读/写超过这些内存,因此运行时很愉快(没有内存损坏) 奥托 将分配刚好足够的内存来保存4int值。注意:这并不一定意味着由于可能的对齐填充(然而,在int的情况下,这不太可能),该内存足以容纳具有4个整数的结构 但再一次——在您的平台上,您也没有用第二个代码破坏内存 至于编译器错误,或者说缺少这些错误C不像其他一些语言(例如C++)那样是强类型语言,指针转

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

奥托

将分配刚好足够的内存来保存4
int
值。注意:这并不一定意味着由于可能的对齐填充(然而,在
int
的情况下,这不太可能),该内存足以容纳具有4个整数的结构

但再一次——在您的平台上,您也没有用第二个代码破坏内存


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

为什么您希望此代码失败?sizeof(char*)==sizeof(int*),这是一个简单的指针。为什么有些东西会坏呢?我是个新手。。请解释为什么不应该?函数明确指定int*作为输入参数。@Dima00782:不同的指针类型通常大小相同,但是语言并不能保证这一点。在这种情况下,char在C中是一个整数类型,所以强制转换是完全合法的。你是对的,标准没有提到任何关于结构大小的内容。但是,它指出四个
t
的数组的大小必须是
4*sizeof(t)
,如果
t
类型的对象无法通过所有对齐方式访问,则这会强制任何类型的
t
都包含其自身的填充。因此,编译器绝对没有理由用任何填充来布局结构的四个相同成员。但是标准并没有规定编译器必须这样做。
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);
FourInts* heap_fourints=malloc(sizeof(FourInts) * 4);
FourInts* heap_fourints=malloc(sizeof(int) * 4); // int, not ints(!)