调用calloc函数时切换参数会发生什么?

时间:2016-01-30 18:53:30

标签: c pointers

我今天花了很长时间试图弄清楚为什么一个超级简单的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的答案非常适合。如果这仍然无法帮助其他用户,那么让我们删除问题并完成它。

1 个答案:

答案 0 :(得分:3)

callocfread的原型是:

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失败。