0

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

这是我的代码:

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 必须有一个 value '\0',因为,我们之前复制了确切的字符串,所以,'\0'必须已经复制了。

但是,当我更换我的

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

p++;

即,我只增加到p字符串的末尾,并且不将字符串复制到s2,条件

而(*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);
4

1 回答 1

3

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

另一种可能性是内存权利 BEFOREa恰好包含\0. 如果您有以下情况,可能会发生这种情况:

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

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

在这种情况下发生的情况是循环复制了这个\0', but it doesn't stop immediately. It keeps on copying until it eventually runs in to a\0 in*q . But when you look atf , you just see the reverse ofa`,因为这个空字节被复制了。

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

C 语言不能保证这一切,这只是内存布局通常完成的方式。

于 2013-04-11T02:40:42.550 回答