gpt4 book ai didi

c - 这个条件检查是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 07:28:40 25 4
gpt4 key购买 nike

我写了一个通过指针反转字符串的函数,代码运行良好,没有错误,但有些事情我想知道。

这是我的代码:

char * xstrrev(char *s1, char *s2){
register char *p = s1;
register char *q = s2;
char *r = s2;
do{

*(s2++) = *(p++); //first copy the string, afterwards, replace it

}while(*p);
p--; //to eliminate trailing '\0' while reversing.
do {
*(q++) = *(p--); //replace contents by reverse contents,
}while(*q);
return r;
}

这里,在倒数第三行, *q 必须有一个值 '\0' ,因为,我们之前复制了准确​​的字符串,所以, '\0' 必须已被复制。

但是,当我更换我的

*(s2++) = *(p++);

p++;

即我只增加p到字符串结尾,不把字符串复制到s2,条件

while(*q)

仍然有效。在这种情况下,*q 不应该有 \0,对吧?那么这个条件是如何工作的呢?

当我将 while(*q) 替换为 while(*q!='\0')

时是一样的

编辑::它被称为:

char  a[110]= "hello";
char f[116];
xstrrev(a,f); //reverse a and put to f
puts(f);

最佳答案

如果它起作用了,那完全是偶然的。调用者提供的字符串 s2 可能在 s2 的末尾有 \0。但是你不能依赖于此,它取决于调用者如何初始化它传递的字符串。

另一种可能是 a 之前的内存恰好包含 \0。如果您遇到类似情况,就会发生这种情况:

char something[] = "foo";
char a[110] = "nacan";

something 的内存正好在 a 的内存之前,因此 something 的尾随 null 将在第一个字节之前一个

在这种情况下发生的是循环复制此 \0',但它不会立即停止。它不断复制,直到它最终运行到 a\0in*q。但是当你查看f时,你只会看到a`的反转,因为这个空字节被复制了。

如果您想看到这种情况发生,请在调试器中单步执行您的函数。

C 语言无法保证这些,这只是内存布局的常见方式。

关于c - 这个条件检查是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15939742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com