我正在运行一个代码,该代码导致分段错误(Core dumped(。
我有一个函数,它返回一个strlen的无符号整数数据类型,它接受一个未引用变量指针的char数据类型或char数据类型的变量作为输入参数。
我知道我正在增加一个const-char指针变量,这不是一个很好的做法。我读到,增加一个点并取消引用是一个很好的选择,而不是增加指针变量所指向的数据
我的意思是*s++;至*(++s(;它们有多不同?或者他们做同样的操作?我在两个操作中都看到了分段错误(核心转储(。或者可能是我应该只增加指针?那是
size_t strlen(const char *s)
{
size_t len = 0;
while (*(++s) && ++len);
return len;
}
这个while循环通常是不正确的
while (*(++s) && ++len);
如果用户将传递一个空字符串,则由于指针s的递增,在循环的第一次迭代中将跳过终止的零字符"\0"。这可能导致未定义的行为。
只需按照的方式重写while循环
while ( *s++ ) ++len;
请注意,指针s应指向一个字符串:以零字符' '
结束的一系列字符。
这两个表达式*++s
和*s++
之间的区别在于,在第一种情况下,指针首先被递增,结果值被取消引用。而在第二种情况下,最初的指针被取消引用,只有在那之后,递增的副作用才应用于指针。