C中的数组算术问题

时间:2011-03-29 16:35:37

标签: c gcc pointer-arithmetic

我在使用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 个答案:

答案 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)

C中是否有任何称为阵列算术的东西?阅读本文:

Arrays are not Pointers

了解如何使用strstr()

答案 3 :(得分:0)

错误或警告没有太大的不同,只是表明编译器认为问题有多严重。

但为什么要使用unsigned char作为文件名?这与strstr冲突,char*仅处理{{1}},其参数和返回类型都是如此。

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