C/C++:*(p++)慎用!!!!!

  各位代码界的大佬大家好,今天跟大家分享一个在C/C++中常用,但是很危险的一串代码——*(p++)

  为什么说这一行代码比较危险呢,因为对于C/C++来说,成也指针,败也指针。C/C++中指针便于我们操作一块连续的内存空间中内容,但是同时我们也要承担一些风险,比如:内存泄漏,野指针,只想垃圾数据等等。今天我们要说的就是指向垃圾数据的问题。

  话不多说,先来撸一串代码。

  

#include <stdio.h>

int main()
{
   char* buf = "test11111";
  int len = 0; while(*p) { len++; buf++; } printf("%d\n", len); printf("%s\n", buf); }

  i,这不就是求一个字符串的长度嘛,有什么问题呢?

  大家可能有所不知,风萧萧兮易水寒,壮士一去兮不复还。对一个指针进行++操作,尤其是这个指针还是一个以后可能用到的全局变量,那么这个指针所指向的数据已经不是原来的数据,是++之后的那一块内存空间

  运行结果如下:

    D:\C\test.c:5:17: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
    char* buf = "test11111";
          ^
    9

    

    [Finished in 0.6s]

  握草,对字符指针++之后,原来的字符串竟然没了。兄弟莫慌,道理很简单。C/C++为了便于字符串操作,每个字符串结尾都会有一个'\0'作为字符串结束的标记,'\0'所代表的意思也就是0的意思。当你对指针++求长度时,指针移到了所谓的’\0'也就结束了,所以新的指针指向的’\0'以后的内存空间。哇,垃圾,不对,垃圾数据。

  如果想要得到原来的数据怎么办呢?

  p--呗

  不过除此之外还有更好的办法来解决这个问题,接下来就让我安利给各位:

  方法一:

    

#include <stdio.h>

int main()
{
    char buf[] = "test11111";
    char *p = buf;
    int len = 0;
    while(*p)
    {
        len ++;
        p ++;
    }
    printf("%s\n", buf);
    printf("%d\n", len);
}

  我们让一个指针去指向那个字符串。

  方法二:

    

#include <stdio.h>

int main()
{
    char* buf = "test11111";
    int len = 0;
    while(buf[len++])
    {
        ;
    }
    printf("%s\n", buf);
    printf("%d\n", len);
}

  方法三:

    正在找,不要急,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

 总之,*(p++)是一个很危险的代码,这一串代码在汇编语言中有专门的一串代码与之对应,所以在C语言转换为汇编语言时,用这一串代码也是非常方便快捷,但是同时也要承担一定的风险,所以珍爱生命,慎用指针。

    

posted @ 2019-02-21 10:41  huobn  阅读(1026)  评论(0编辑  收藏  举报