2016-01-30 64 views
0

今天我花了不少时间试图弄清楚为什么一个读取文本文件的超级简单的C函数不起作用。我能够使其通过交换参数calloc功能工作:在调用calloc函数时切换参数会发生什么?

相反的:

calloc(1, size_of_the_memory_to_allocate)

我所做的:

calloc(size_of_the_memory_to_allocate, 1)

所以不是大小20的1元,我做了20号的尺寸1.

calloc(size, 1) 

分配有没有区别?

编辑2: 我想我对这个问题还不够清楚,或者它被误解了。问题是:“为什么使用calloc分配指针指针需要交换参数?”。这不是关于调试代码,我也没有要求任何人运行它,这是关于如何calloc工作。 @chqrlie的答案正是我所期待的。我想我犯了一个错误,就是在这个问题上增加了任何代码,读者只关注它,而不是我所要求的。所以,这是一个编辑,现在chqrlie的答案非常合适。如果这仍然不会对其他用户有帮助,那就让我们删除问题并完成它。

+1

“缓冲区未正确分配”。这有点太模糊。你究竟看到了什么? –

+3

必须有另一个你没有发现的问题,改变程序使其他一些UB的效果变得良好。 –

+3

提供[mcve]。例如(!):什么是“尺寸”? “常规指针”是什么意思? 'calloc'甚至不需要指针参数。 – Olaf

回答

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()中实现了一个非标准约束,最终导致了一个bug的回火。

注意calloc(nmemb, size)不能只叫malloc(nmemb * size)因为潜在的算术溢出,这在size_t参数的情况下在标准中定义。例如calloc(-1, -1)必须失败,但如果天真地呼叫malloc(nmemb * size),将返回malloc(1)。对于这种溢出的测试可能会出现错误,因为calloc(1, size)失败,而calloc(size, 1)失败,并且出现大的size

相关问题