我有一个代码,但在编译时有一个警告,这就是警告:

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]++;
}

最佳答案

如果cFilechar *,将其索引为cFile[posF]与做*(cFile + posF)相同,或者“从数组的起始处给我什么是posF位置”,操作符(&)的地址是不必要的,如果不是,这可能与您想要的相反(您想要取消引用-*-这是用下标符号自动为您完成的)。
正如其他人所建议的,正确的代码很可能是:

lQueryData[posDB] = cFile[posF];

之所以会收到特定的警告,是因为使用&cFile[posF]可以获取cFileposF处字符的地址(即指向该字符的指针)。但是,当您试图将它分配给lQueryData数组中的某个位置时,它必须首先(在内部)将其转换为标量类型。指针只是一个索引到内存中的数字,因此当用于“指向”事物以外的任何事物时,它只是一个整数。因此,您所拥有的是从指针生成一个整数,而不需要显式转换。
您可以考虑使用clang来编译,而不是使用(我认为是)GCC如果您可以访问它,那么它有更容易访问的错误消息。例如,上面代码的错误消息是:警告:指向整数转换的指针与使用“char*”类型的表达式赋给“char”的不兼容;删除&(带有指向有问题“&”符号的小可视指针)。

09-26 06:49