我有一个代码,但在编译时有一个警告,这就是警告:
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
,但是cFile
和lQueryData
都是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]++;
}
最佳答案
如果cFile
是char *
,将其索引为cFile[posF]
与做*(cFile + posF)
相同,或者“从数组的起始处给我什么是posF
位置”,操作符(&
)的地址是不必要的,如果不是,这可能与您想要的相反(您想要取消引用-*
-这是用下标符号自动为您完成的)。
正如其他人所建议的,正确的代码很可能是:
lQueryData[posDB] = cFile[posF];
之所以会收到特定的警告,是因为使用
&cFile[posF]
可以获取cFile
中posF
处字符的地址(即指向该字符的指针)。但是,当您试图将它分配给lQueryData
数组中的某个位置时,它必须首先(在内部)将其转换为标量类型。指针只是一个索引到内存中的数字,因此当用于“指向”事物以外的任何事物时,它只是一个整数。因此,您所拥有的是从指针生成一个整数,而不需要显式转换。您可以考虑使用clang来编译,而不是使用(我认为是)GCC如果您可以访问它,那么它有更容易访问的错误消息。例如,上面代码的错误消息是:警告:指向整数转换的指针与使用“char*”类型的表达式赋给“char”的不兼容;删除&(带有指向有问题“&”符号的小可视指针)。