各位代码界的大佬大家好,今天跟大家分享一个在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语言转换为汇编语言时,用这一串代码也是非常方便快捷,但是同时也要承担一定的风险,所以珍爱生命,慎用指针。