The last line in the function is not doing what was intended. The code is obscure to the point of impenetrability.
看来,目标是在第一次记忆分配中分配一系列的<代码>int,因为<代码>sizeof (int)。 至少,如果你打算分配一系列结构点,你需要使用<条码>(SomeType *)条码>,某些点的类型(<条码>(避免*)条码>。 作为书面材料,这将在64轨道环境中 fail然失败。
该阵列由结构负责人(ArrayHeader
)分配,然后是阵列。 返回的价值假定是阵列的开始;ArrayHeader大概会从点子中找到。 这显然是罪 sin祸首,无法维持。 它可以工作,但需要极为谨慎,并且(正如Brian Kernighan所说)“如果你在撰写守则时尽可能避免,你会如何去掉”。
页: 1
void _arrayCreateSize( void ***array, int capacity )
{
(*array) = malloc( (capacity * sizeof(int)) + sizeof(ArrayHeader) );
((ArrayHeader*)(*array))->size = 0;
((ArrayHeader*)(*array))->capacity = capacity;
// printf("Test!
");
*(char**)array += sizeof(ArrayHeader);
}
It adds sizeof(ArrayHeader) * sizeof(char *)
to the address, instead of the intended sizeof(ArrayHeader) * sizeof(char)
. The last line should read, therefore:
*(char *)array += sizeof(ArrayHeader);
或者,正如评论和替代答复所指出的:
*(ArrayHeader *)array += 1;
*(ArrayHeader *)array++;
我顺便指出,职能名称不应真正从强调开始。 外部名称从“强调”开始,留待执行(C汇编者和图书馆)。
问题询问“f(
> statement fixances”。 答案是因为它将问题推向了。 你会收到一份Heisenbug,因为所分配的记忆被滥用,而<代码>f()的存在能够稍微改变该守则的行为。
Recommendation
- Run the program under
valgrind
. If you don t have it, get it.
- Revise the code so that the function checks the return value from
malloc()
, and so it returns a pointer to a structure for the allocated array.
- Use the clearer code outlined in Michael Burr s answer.