警告C4047:'=':'int'的间接级别与'char *'不同

时间:2010-01-10 23:42:23

标签: c

int utstrlen(char* src){
    int length=0 ;
    if(isOurs(src) ==1){
        length = src - 2 * sizeof(int);
    }
    return length;
}

我收到警告C4047:'=':'int'的间接级别与来自行length = src - 2 * sizeof(int);的'char *'错误不同有人可以解释它有什么问题吗?谢谢!

5 个答案:

答案 0 :(得分:3)

根据您的previous question,您想要

length = *((int *)(src - 2 * sizeof(int)));

虽然假设没有填充。更好的方法是使用offsetof()

String *beg = (String *)(src - offsetof(struct String, ptr));
length = beg->length;

我假设您正在使用上一个问题中的结构。

答案 1 :(得分:1)

我怀疑你有这样的字符串结构:

struct string {
    int length;
    int somethingelse; /* thanks alok */
    char *str;
}

并且当给出指向str的指针时,此函数试图访问长度字段?我对么?我想这就是我们的检查(以确保它不是任何旧的字符串)。在这种情况下,你想要这个:

<击> length = (*((int*)(src - 2))) * sizeof(int);

int utstrlen(char* src){
    int length=0 ;
    if(isOurs(src) ==1){
          length = *((int*)(src - (2 * sizeof(int)))); /* from str moveback 2 ints worth*/
    }
    else {
        //return strlen(src) ?
    }
    return length;
}

但理想情况下你不会这样做。它不便携或不可维护。如果编译器插入您不知道的填充,会发生什么? C99标准表示它不会在0大小的数组和前一个字段之间放置填充,但是没有什么可以阻止它与其他字段混淆(例如,如果你有多种类型)。

如果有人稍后出现并在结构中插入更多数据会怎样?当然,他们必须把它放在字段str之前,因为'struct hack'通过最终实现它来工作。理想情况下,您应该使用offsetof()来执行此操作,这是一个标准宏。 Alok在这里提供了更好的解决方案 Ugly Macro Interpretation (just 1 line)

编辑(似乎在2分钟内我输入了新的最后一段,Alok的offsetof()答案已经接受了这一段;)

答案 2 :(得分:0)

srcchar *;长度是int。因此,编译器将此行视为类似于:

length = (int) (src - 2 * sizeof(int));

我不确定这个警告对你有什么困惑,而且我也对你的代码试图做什么感到困惑。那么,我的建议是尝试以下测试代码,看看它打印的是什么:

void test(void) {
    char *foo = "hello\n";

    printf("%s\n", foo);
    printf("%d\n", (int) foo);
    printf("%s\n", foo+1);
    printf("%d\n", ((int) foo) + 1);
}

你会注意到,在一次使用指针时算术比在另一次使用中更有意义。

答案 3 :(得分:0)

src - 2 * sizeof(int)是指针算术 - 该表达式的结果是另一个char*指针。您正尝试将char*分配给length,这是int,这就是您收到错误的原因。我不知道这个函数应该做什么,但如果你真的想要,你可以将值转换为intlength = (int)(src - 2 * sizeof(int))。但同样,我没有看到你的功能使用。

答案 4 :(得分:0)

不确定。

src是一个指针; 2 * sizeof(int)是一个整数值。

虽然这确实是合法的

  1. 从两个指针中减去两个指针(结果是它们的地址不同,作为整数整数类型,可能是 size_t { {1}}),以及

  2. 从指针中减去一个整数(结果是指向该指针之前位置的指针),

  3. 尝试将(2)的结果分配给整数变量(ptrdiff_t)是不合法的。