循环中的奇怪指针行为

Strange pointer behaviour in loop

本文关键字:指针 循环      更新时间:2023-10-16

我不知道为什么这段代码不起作用。(我知道如何解决它,但我对这个特定的解决方案感兴趣)它接受一个字符串并放在另一个字符串的末尾。 x = "abc"y = "def"和执行foo后,x = "abcdef"。执行我的代码后,我只得到"abc".

#include <stdio.h>
#define MAX 10
void foo(char *x, char *y){
    while(*x++);
    while(*y){
        *x++ = *y++;
    }
    *x = '';
}
int main(void){
    char x[MAX+1], y[MAX+1];
    scanf("%s %s", x, y);
    foo(x, y);
    printf("%s", x);
    return 0;
}

如果我这样做,代码工作得很好。

while(*x) x++;
即使在

发现 null 并且循环完成后,此表达式也会递增x

while(*x++);

在这种情况下,您将第二个字符串附加到 null 之后,以便不会"看到"字符串的一部分。字符串变为 "abcdef"

当找到 null 时,以下内容不会递增x,因此*x循环完成后将指向 null:

while(*x) x++;

因此,在这种情况下,您的字符串正确显示为 "abcdef" .

这个循环:

while(*x++);

x移动到空终止符之外。所以你的c-string在和以前一样的地方结束。y中的字符被写入x,但它们在空终止符之后,因此它们不会被打印出来。

当您使用

while(*x++);

x指向语句末尾的 null 字符后面的一个。实际上,你最终会得到

x[] = {'a', 'b', 'c', '', 'd', 'e', 'f', '', ....}

main.