0

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

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

3 回答 3

2

表达式 &cFile[posF] 是一个指向值的指针,所以你应该像这样取它的值:

lQueryData[posDB] = cFile[posF];
于 2012-12-15T05:24:10.870 回答
2

如果它们都是,char *那么为什么要使用 & 运算符。说啊

lQueryData[posDB] = cFile[posF];
于 2012-12-15T05:24:52.050 回答
2

如果cFile是 a char *,则对其进行索引cFile[posF]与做 相同*(cFile + posF),或者“给我posF从数组开头开始的任何位置的值”。您的地址运算符 ( &) 是不必要的,如果不是,它可能与您想要的相反(您想要取消引用 -*使用下标符号自动为您完成)。

正如其他人所建议的那样,正确的代码很可能是:

lQueryData[posDB] = cFile[posF];

您收到特定警告的原因是因为 using获取了at中字符&cFile[posF]的地址(即指向 的指针) 。但是,当您尝试将其分配到数组中的某个位置时,它必须首先将其(内部)转换为标量类型。指针只是一个索引到内存中的数字,因此当用于“指向”事物之外的任何东西时,它只是一个整数。因此,您所拥有的是从指针制作整数,而无需显式强制转换。cFileposFlQueryData

You might consider compiling with clang instead of (what I presume is) GCC if you have access to it, it has much more accessible error messages. For instance, the error message for your code above is: warning: incompatible pointer to integer conversion assigning to 'char' with an expression of type 'char *'; remove & (with a little visual pointer to the offending "&" sign).

于 2012-12-15T05:49:36.613 回答