我已经使用指针算术编写了一个函数来计算字符串的长度,但是它似乎只能通过使用hackish方法来正常工作。
我尝试使用对内存寻址的理解来使该功能按预期工作。
0
第一个函数返回正确的长度,但是第二个函数返回0,这为什么?
答案 0 :(得分:3)
这两个函数都不正确,因为:
select t1.* from table_name t1
where exists( select 1 from table_name t2 where t1.post_user_id=t2.post_user_id
and post_shared<>0)
,因此行为是不确定的。length
具有未定义的行为,因为对length += str - (++str);
的副作用可能发生在获取左操作数str
的值之前或之后。str
是违反约束的:在C中不允许添加2个指针。您应该写:
length += str + (++str);
根据目标体系结构,仅递增size_t getLength(const char *str) {
size_t length = 0;
while (*str != '\0') {
length++;
str++;
}
return length;
}
并最后计算差值可能会更有效:
str
答案 1 :(得分:-1)
您应该在两个示例中初始化length变量。
您实质上是在尝试这样做:
int getLength(const char* str) {
int length = 0;
while(*str != '\0') {
length ++; // str - (++str) is always -1;
str++;
}
return length;
}
答案 2 :(得分:-3)
您的功能有很多问题:
下面有strlen函数的两个几乎相同的版本。有时,根据目标硬件的不同,小的更改可能会对功能性能产生重大影响。
此版本对于ARM目标而言更为理想
size_t getlen(const char *s)
{
const char *p = s;
while(*p++);
return p - s - 1;
}
这对于x86目标来说更好
size_t getlen(const char *s)
{
const char *p = s;
while(*p)
{
p++;
}
return p - s;
}