C:施法警告

时间:2012-12-15 05:21:27

标签: c casting warnings

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

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

3 个答案:

答案 0 :(得分:2)

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

lQueryData[posDB] = cFile[posF];

答案 1 :(得分:2)

如果它们都是char *,那你为什么要使用&amp;运营商。只是说

lQueryData[posDB] = cFile[posF];

答案 2 :(得分:2)

如果cFilechar *,则将其编入cFile[posF]的索引与执行*(cFile + posF)相同,或者“给我posF的值阵列开头的地方。“您的地址操作员(&)是不必要的,如果不是,则可能与您想要的相反(您想要取消引用 - * - 这是自动为您完成的下标符号)。

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

lQueryData[posDB] = cFile[posF];

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

您可以考虑使用clang而不是(我认为是)GCC进行编译,如果您有权访问它,它会有更多可访问的错误消息。例如,上面代码的错误消息是:警告:指向整数转换的不兼容指针,使用类型为'char *'的表达式分配给'char';删除&amp; (带有一个可视指针指向违规的“&amp;”符号)。