首页 > C/C++:*(p++)慎用!!!!!

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

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

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

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

  

#include int main()
{char* buf = "test11111";

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

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

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

  运行结果如下:

    D:C est.c:5:17: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

    char* buf = "test11111";

          ^

    9

    

    [Finished in 0.6s]

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

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

  p--呗

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

  方法一:

    

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

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

  方法二:

    

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

  方法三:

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

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

    

转载于:https://www.cnblogs.com/huobingnan/p/10410918.html

更多相关:

  • 智能指针——shared_ptr为了更容易地使用动态内存,新的标准提供了智能指针来管理动态对象。智能指针的行为类似常规指针,重要的区别是它负责自动释放指向的对象。   智能指针的使用方式与普通指针类似。解引用一个智能指针返回它指向的对象。 1 if (p1 && p1->empty())   最安全的分配和使用动态内存的方法是调用...

  • 1,一个整形数:  int a; 2,一个指向整形数的指针: int *a; 3,一个指向指针的指针,它指向的指针指向一个整形数:  int **a; 4,一个有10个整形数的数组: int a[10]; 5,一个有10个指针的数组,每个指针指向一个整形数: int *a[10]; 6,一个指向有10个整形数的数组的指针:  int...

  • 1 typedef char ListData; 2 //表示以后可以用ListData来代替char类型 3 4 typedef struct node{ //此处node,只在结构体中出现和使用 5 ListData data; 6 struct node *link; 7 }List...

  • 常用的几种数据类型: 类型标识符 说明 字节 值的范围   int 整型 4 –2,147,483,648 到 2,147,483,647 VC++中为long int类 short 短整型 2 –32,768 到 32,767   long 长整型 4 –2,147,483,648 到 2,147,4...

  •         NSString * str = @"123";char buf[20];[str getCString:buf maxLength:20 encoding:NSASCIIStringEncoding];NSLog(@"%s",buf); 转载于:https://blog.51cto.com/8947509/1...

  • sscanf 目录 名称:函数原型:头文件:说明:支持集合操作:例子: 编辑本段名称:   sscanf() - 从一个字符串中读进与指定格式相符的数据. 编辑本段函数原型:   Int sscanf( const char *, const char *, ...);   int scanf( const char...

  • THE START更新堪称轻量级MATLAB的一款软件最新版-Maplesoft Maple 2019.2 中文版。Maple是符号和数字计算环境,也是一种多范式编程语言,由Maplesoft开发,还涵盖了技术计算的其他方面,包括可视化,数据分析,矩阵计算和MATLAB连接。MapleSim工具箱添加了用于多域物理建模和代码生成的...

  • 同学们,你们在学习他人的代码,是否见过这样的代码 def main(): def user_info(gender): 当你还是个小萌新时,你一定会认为这是个很牛逼的语法。 当你有了一点基础时,你一定会想要了解这个语法,并且尝试去使用它。 那么今天,我们便来了解这个牛语法。 有了一点点的python基础,我们来看这段代...

  •     自从用了这些快捷键,鼓励师也不需要了,代码开发效率蹭蹭提升!!! ctrl+shift+[折叠代码 (这个比ctrl+k ctrl+l、ctrl+k ctr+j不知道好用多少倍!) ctrl+shift+]展开代码 ctrl+shift+T打开手贱不小心关掉的窗口 【推荐】ctrl+shift+O打开当前文件...

  • 在提交代码之前,建议最好先Fetch代码下来(如果有冲突,系统会提示),然后再操作Merge到本地分支,这样做是为了避免有其他人同时修改了当前分支,如果直接用Ctrl+T(pull代码)极有可能覆盖本地分支最新代码,安全起见先Fetch代码(Ctrl+Alt+Shift+1)——所谓:小心驶得万年船!...

  • 每次复制代码时,如果代码里有 // 这样的注释就容易让格式乱掉,通过下面的设置就可以避免这种情况。 粘贴代码时取消自动缩进 VIM在粘贴代码时会自动缩进,把代码搞得一团糟糕,甚至可能因为某行的一个注释造成后面的代码全部被注释掉,我知道有同学这个时候会用vi去打开文件再粘贴上去(鄙人以前就是这样),其实需要先设置一下 s...