原始代码:
int main()
{
void strfunc(char *s);
char string[10];
strfunc(string);
return 0;
}
void strfunc(char *s)
{
char *temps;
*s = getchar();
temps = s;
*(s+1) = '\0';
printf("%s\n", s);
printf("%s\n", temps);
}
运行结果(没有任何错误):
之后我将
*(s+1) = '\0';
改成
*s++ ='\0';
运行结果出错,结果如下:
所以我想请教大家一个问题,** *(s+1) = '\0';与 *s++ ='\0';**这两者不都是将指针s的地址向后移动一个字符的长度吗?为什么结果却完全不同呢?
为啥把语义如此清晰的代码换成如此糟糕的实现。
s指针的后一位变为结束符
*(s+1) = '\0';
s指针当前的字符变为结束符,s指针指向后一个字符
*s++ ='\0';
// 等同于
*s='\0';
s=s+1;
由于temps指向原s指向的字母,但被设为结束符,所以没有输出。
s指向的是没有任何有意义字符的随机乱码。输出时还越界,没崩算运气好。
用错了吧, *s++ ='\0';是先赋值再自加
你可以试试++ *s ='\0';
有帮助的话望采纳,谢谢!
*s++=(*s)++ 吧好像
*(s+1) 是指针 s + 偏移量 1 ,s 指针指向未改动
*s++ ,s++是指针 s 自增 1 个偏移量,相当于 s = s + 1