while循环与字符串奇怪的bug

今天编程的时候遇到一个问题,以前没有遇到过,做个记录:下面是我写的一个小的测试程序

#include <stdio.h>
#include <string.h>

int main(void)
{
    char *str = "abcASJSJJ";
    char *dst = "bc";
    printf("%p  %c\n", dst, *dst);

    /* while(*dst != '\0'){ */
    /*     printf("%c\n", *dst); */
    /*     dst++; */
    /* } */
    while((*dst++) != '\0'){   
        printf("1\n");
    }
    printf("%c\n", *dst);
    printf("%p\n", &dst[0]);
    printf("%p\n", &dst[2]);
    printf("%p  %c\n", dst, *dst);
    if(*dst == '\0')
        printf("true\n");
    else
        printf("false\n");

    return 0;
}

注意上面的while循环,我的预期是要输出true。你觉得会输出什么呢?

运行结果:


结果是false,而且为什么最后*dst不是'\0',而是个随机字符呢。还有首地址已经改变了

通过gdb调试,主要原因就在于while循环那一句,dst++执行了三次,dst已经指向了字符串'\0'的下一个字符,是一个

没有定义的内存,值是随机的。

修改方法就是替换成代码中注释的部分。就可以得到预期的结果了。当然dst的地址都改变了,如果想dst还指向原字符串首部,

需要一个临时变量保存该地址。

猜你喜欢

转载自blog.csdn.net/lyztyycode/article/details/80503034