0

我在使用 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;

CC上的错误是:

"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

你能帮忙解释一下为什么这里会给出警告“不正确的指针减法”和示例程序显示错误吗?

4

4 回答 4

1
void * bar;
void * foo;
...
foo = bar + 1;

那是未定义的行为,就在那里!您指的是一个甚至没有分配的内存位置。

编辑

现在你有另一个问题:即使你成功地声明了两个数组,你也没有清理/初始化它们。只有上帝知道什么strstr()会回报给你。

您编译此代码的问题是 strstr() 需要 2const char*并且您将Filename定义为无符号:char unsigned FileName[100];

char *strstr(const char *haystack, const char *needle);

于 2011-03-29T16:38:51.597 回答
1

你没有错过包括<string.h>吗?

如果是,则猜测 strsrt 的原型,默认情况下它返回一个 int,因此是无效的指针操作。

否则,似乎签名不匹配是警告/错误的原因。在你的桌子出现两次之前使用(char*)演员表,它就会消失。

于 2011-03-29T16:45:38.957 回答
1

有什么叫做数组算术的东西C吗?读这个:

数组不是指针

并查看如何使用strstr()

于 2011-03-29T16:54:03.363 回答
0

错误或警告没有太大区别,只是显示编译器认为问题有多严重。

但是为什么要使用unsigned char文件名呢?这与它的参数和返回类型strstr只处理冲突。char*

这就是编译器试图以不同的方式告诉你的。

于 2011-03-29T16:51:44.097 回答