我在使用cc编译的长文件中有一个C代码。但是当我尝试在gcc上编译它时会出错。我把这个特定的代码放在小程序中,然后尝试在cc上编译,但是在那里失败了。
这是来源:
#include <stdio.h>
int main (int argc, char **argv)
{
char unsigned FileName[100];
char test[100];
FileName[strstr(FileName,test) - FileName] = 0;
return 0;
}
此行导致问题:
FileName[strstr(FileName,test) - FileName] = 0;
错误是:
"foo.c", line 10: operands have incompatible types:
int "-" pointer to unsigned char
并且在gcc上是:
foo.c:10: error: invalid operands to binary - Both are same.
但是当我在CC上编译原始文件时,它编译并发出警告。像这样:
"dbtprc.c", line 643: warning: argument #1 is incompatible with prototype:
prototype: pointer to const char : "/usr/include/iso/string_iso.h", line 133
argument : pointer to unsigned char
"dbtprc.c", line 643: warning: improper pointer subtraction
你能帮忙为什么在这里给出警告“不正确的指针减法”和示例程序显示错误?
答案 0 :(得分:1)
void * bar;
void * foo;
...
foo = bar + 1;
这是未定义的行为,就在那里!您指的是甚至没有分配的内存位置。
修改强>:
现在你有另一个问题:即使你成功地声明了两个数组,你也无法清理/初始化它们。只有上帝知道strstr()
会回到你身边。
您编译此代码的问题是strstr()需要2 const char*
并且您将文件名定义为无符号:char unsigned FileName[100];
char * strstr(const char * haystack,const char * needle);
答案 1 :(得分:1)
你不想错过加入<string.h>
??
如果是,则猜测strsrt的原型,默认情况下它返回一个int,因此无效的指针操作。
否则,签名不匹配似乎是警告/错误的原因。
在你的桌子出现两次之前使用(char*)
演员表,它就会出现。
答案 2 :(得分:1)
答案 3 :(得分:0)
错误或警告没有太大的不同,只是表明编译器认为问题有多严重。
但为什么要使用unsigned char
作为文件名?这与strstr
冲突,char*
仅处理{{1}},其参数和返回类型都是如此。
这就是编译器试图用不同的方式告诉你的。