我试图给一张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/

10-15 02:12