我有一个代码,但在编译时有一个警告,这是警告:
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]++;
}
答案 0 :(得分:2)
表达式&amp; cFile [posF]是指向值的指针,所以你应该像这样取值:
lQueryData[posDB] = cFile[posF];
答案 1 :(得分:2)
如果它们都是char *
,那你为什么要使用&amp;运营商。只是说
lQueryData[posDB] = cFile[posF];
答案 2 :(得分:2)
如果cFile
是char *
,则将其编入cFile[posF]
的索引与执行*(cFile + posF)
相同,或者“给我posF
的值阵列开头的地方。“您的地址操作员(&
)是不必要的,如果不是,则可能与您想要的相反(您想要取消引用 - *
- 这是自动为您完成的下标符号)。
正如其他人所建议的那样,最有可能是正确的代码:
lQueryData[posDB] = cFile[posF];
您收到特定警告的原因是因为使用&cFile[posF]
获取cFile
中posF
处的字符的地址(即指向的指针) }}。但是,当您尝试将其分配到lQueryData
数组中的某个位置时,它必须首先将其(内部)转换为标量类型。指针只是一个索引到内存中的数字,因此当用于“指向”事物的任何东西时,它只是一个整数。因此,你所拥有的是从指针生成一个整数而没有显式的强制转换。
您可以考虑使用clang而不是(我认为是)GCC进行编译,如果您有权访问它,它会有更多可访问的错误消息。例如,上面代码的错误消息是:警告:指向整数转换的不兼容指针,使用类型为'char *'的表达式分配给'char';删除&amp; (带有一个可视指针指向违规的“&amp;”符号)。