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語言轉換為匯編語言時,用這一串代碼也是非常方便快捷,但是同時也要承擔一定的風險,所以珍愛生命,慎用指針。
轉載于:https://www.cnblogs.com/huobingnan/p/10410918.html
總結
以上是生活随笔為你收集整理的C/C++:*(p++)慎用!!!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bootstrap框架和inconfon
- 下一篇: 黑曜石手链一般多少钱?