我试图给一张2GByte大的表打电话。以下代码失败
#define MAX_FILEID 131072 // 17 bits 131K file IDs
#define MAX_OFFSET 8192 // offset loctions (refLoc - Loc)
#define MATCH_TAB_SIZE (MAX_OFFSET*MAX_FILEID)
matchTab = (unsigned char*) calloc(MATCH_TAB_SIZE*2, sizeof(unsigned char));
if ( matchTab==NULL)
{
fprintf(stderr, "calloc %f Mbyte failed for matchTab \n", MATCH_TAB_SIZE*sizeof(unsigned char)/(1024*1024.0) );
return;
}
else
{
fprintf(stdout, "assigned %f Mbyte \n", MATCH_TAB_SIZE*sizeof(unsigned char)/(1024*1024.0) );
}
但是,如果我将calloc行替换为
matchTab = (unsigned short*) calloc(MATCH_TAB_SIZE, sizeof(unsigned short));
成功了。
我想知道为什么。我的机器是具有至少80 GB RAM的64位linux。
最佳答案
8192 * 131072 * 2 = 231
231> INT_MAX
在您的实现中,因此上面的表达式溢出。其结果是不确定的。
使用足够大的类型的文字,例如unsigned int
:
#define MAX_FILEID 131072U // 17 bits 131K file IDs
#define MAX_OFFSET 8192U // offset loctions (refLoc - Loc)
#define MATCH_TAB_SIZE (MAX_OFFSET*MAX_FILEID)
matchTab = calloc(MATCH_TAB_SIZE*2U, sizeof(unsigned char));
或者,在数字较小时将其强制转换为
size_t
:matchTab = calloc(((size_t)MATCH_TAB_SIZE)*2, sizeof(unsigned char));
请注意,请勿投射
calloc
和朋友的结果。 sizeof(unsigned char)
始终为1,因此您可以根据需要使用1
。关于c - calloc 2 gb的内存针对“char”类型失败,但针对“short”成功,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25670719/