2012-12-15 198 views
0

我有一个代码,但有当它被编译警告,这是警告:C:铸造警告

1_redis.c: In function \342\200\230main\342\200\231: 
1_redis.c:131:23: warning: assignment makes integer from pointer without a cast 
[enabled by default] 

它说assignment makes integer from pointer without a cast,但cFilelQueryData都是char*类型,为什么呢?

#define MAX_LINE_NUM 8000000 
#define EACH_THREAD_NUM 10000 


long i,posF,posDB; 
for (i=0;i<DB_NUM;i++) { lQueryPerDB[i] = 0; } 
char *lQueryData = (char *)malloc(DB_NUM*MAX_LINE_NUM*sizeof(char)); 

lLineCount = lFileLen/lLineLen; 
for (i=0;i<lLineCount;i++) { 
    posF = i * lLineLen; 
    iDB = get_DB(cFile[posF]); 
    posDB = iDB * MAX_LINE_NUM + lQueryPerDB[iDB]; 
    lQueryData[posDB] = &cFile[posF];     // this line have warning!!!! 
    lQueryPerDB[iDB]++; 
} 
+0

尝试像(cfile + posF) –

回答

2

如果cFilechar *,索引它像cFile[posF]是一样的做*(cFile + posF),或“给我的一切是从数组的开始posF地方的价值。”您的地址 - 运营商(&)是不必要的,如果不是,它可能会与您想要的相反(您需要解除引用 - *--这是使用下标符号自动完成的)。

正如其他人所建议的,正确的代码是最有可能的:

lQueryData[posDB] = cFile[posF]; 

的原因,你得到你做的特别警告,是因为使用&cFile[posF]得到的地址(即指针cFile的字符posF。但是,当您尝试将其分配给lQueryData数组中的某个位置时,必须先将其(内部)转换为标量类型。指针只是一个索引到内存中的数字,因此当用于指向任何内容的任何内容时,它只是一个整数。因此,你所拥有的是从一个指针开始一个整数,而没有明确的强制转换。

如果您有权访问GCC,您可以考虑使用clang而不是(我认为是)GCC,它具有更多可访问的错误消息。例如,上面的代码的错误消息是:警告:不兼容的指向整型转换的指针指定为'char'且类型为'char *'的表达式;删除&(带有一点点的视觉指针指向违规的“&”标志)。

2

表达& CFILE [POSF]是一个指针的值,所以你应该考虑这样的价值:你为什么要使用&操作

lQueryData[posDB] = cFile[posF]; 
2

如果它们都char *然后。只是说

lQueryData[posDB] = cFile[posF];