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 *'错误不同有人可以解释它有什么问题吗?谢谢!
答案 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)
src
是char *
;长度是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
,这就是您收到错误的原因。我不知道这个函数应该做什么,但如果你真的想要,你可以将值转换为int
:length = (int)(src - 2 * sizeof(int))
。但同样,我没有看到你的功能使用。
答案 4 :(得分:0)
不确定。
src
是一个指针; 2 * sizeof(int)
是一个整数值。
虽然这确实是合法的
从两个指针中减去两个指针(结果是它们的地址不同,作为整数整数类型,可能是 { {1}}),以及size_t
从指针中减去一个整数(结果是指向该指针之前位置的指针),
尝试将(2)的结果分配给整数变量(ptrdiff_t
)是不合法的。