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