类型为';char';但要为'成功;短';

类型为';char';但要为'成功;短';,c,memory,malloc,calloc,C,Memory,Malloc,Calloc,我试图调用一个2字节大的表。以下代码失败 #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

我试图调用一个2字节大的表。以下代码失败

#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));
它成功了

我想知道为什么。我的机器是64位linux,至少有80 gb内存。

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

calloc(16384,sizeof(unsigned char))
远不是2GB。你是说你把它叫做循环吗?对不起,我已经更正了。它应该是2^31,而不是16384
2^31==29
2^30==28
。我很惊讶他们两个都失败了。我怀疑您显示的代码不是您运行的代码。总是复制并粘贴你实际编译的代码。对不起,伙计们。这是我的第一篇文章。原始代码很长。我已经更正了我的帖子。谢谢。成功了!另一个问题是为什么我不应该抛出calloc的结果。如果我不投它……我也会得到这样的错误….Cux/FieldStReReMaEXD。C:33 7:60:错误:无效的转换从“Value*”到“unChalchar *”[fPielix] MatchTabl被定义为char *,您使用的是C++编译器。不要。