我今天花了很长时间试图弄清楚为什么一个读取文本文件的超级简单的 C 函数不起作用。我能够通过在calloc函数中交换参数来使其工作:
代替:
calloc(1, size_of_the_memory_to_allocate)
我做了:
calloc(size_of_the_memory_to_allocate, 1)
因此,我做了 20 个大小为 1 的元素,而不是 1 个大小为 20 的元素。
calloc(size, 1)
Run Code Online (Sandbox Code Playgroud)
分配上有区别吗?
EDIT2:我想我对这个问题不够清楚,或者被误解了。问题是:“为什么使用 calloc 分配指向指针的指针需要交换参数?”。这不是关于调试代码,也不是我要求任何人运行它,而是关于如何calloc工作。@chqrlie 给出的答案正是我想要的。我想我在向问题中添加任何代码时犯了一个错误,而读者却专注于它,而不是我所要求的内容。所以,这是一个编辑,现在 chqrlie 的答案非常合适。如果这仍然对其他用户没有帮助,让我们删除问题并完成它。
为原型calloc和fread主要有:
void *calloc(size_t nmemb, size_t size);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
Run Code Online (Sandbox Code Playgroud)
这些标准 C 库函数之间的参数顺序确实不一致。不幸的是,近40年来一直如此,现在无法改变。
请注意,如果您交换 中的参数calloc,您应该得到完全相同的行为,但情况并非如此,fread因为返回完全读取的元素数。
您在更新的问题中描述的行为非常令人惊讶。要么你没有告诉我们一些事情,要么你的 C 库实现了一个非标准的约束,calloc()结果会适得其反。
需要注意的是calloc(nmemb, size)不能随便叫malloc(nmemb * size),因为潜在的算术溢出,这在案件的size_t论据是在标准中定义。例如calloc(-1, -1)must 失败,但malloc(1)如果天真地调用malloc(nmemb * size). 对这种溢出的测试可能有问题,以至于calloc(1, size)对于calloc(size, 1)大size.