日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

乱入的'\0'

發布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 乱入的'\0' 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看這個題之前,先來回憶一下strlen函數的工作機制:
strlen所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,每碰到一個非’\0’的字符,計數器的值加1,直到碰到第一個字符串結束符’\0’為止,然后返回計數器值(長度不包含’\0’)。

#include <stdio.h>int main() {char a[1000];int i;for(i=0; i<1000; i++){a[i] = -1-i;}printf("%d",strlen(a));return 0; }

第一眼看到題目是不是覺得太簡單了一點,有一種把1000脫口而出的欲望,這么簡單我會出給你?想太多了吧!
且不說這兒數組的類型是char,就算它的類型是int,程序就會輸出1000?想想上面對strlen的定義是怎么說的?遇到’\0’才結束統計,你能保證數組后面的空間第一個字符就存儲的是’\0’嗎?不能吧!因此不要輕易給出答案。

運行后,輸出的答案是這樣的,是不是有點訝異,整個人突然懵了?大大的問號突然充斥著你。

分析一下,這個題其實無非也就以下幾個考點:
1、負數在內存中的存儲方式;
2、char型數據占空間大小;
3、0其實就是’\0’
4、strlen函數什么時候結束統計;

負數在內存中是以其補碼存儲的,那么問題又來了,什么是補碼?正數的補碼是其原碼,負數的補碼是其原碼取反加1,連原碼都不知道的可以去看看補補了。
因為a[i] = -1 - i; 而-1 - i的值一定是負數,本來也沒什么,但你要知道我們的數組元素是char型的,那么它就只占一個字節,即8個bit,所以,當-1 - i的值小到-129時,a[i]里面存的值就不是我們想象的值了,而當 -1 - i的值小到-256時,a[i]里面存的值會嚇你一跳。看看下面這張圖:

可以看見當i = 255時,a[i] = 0,而我們知道0其實就是’\0’,因為’\0’的ASCII是0,而strlen函數是遇到’\0’停止統計的,且不統計’\0’,也就是說它只統計a[255]前面的元素個數,而我們知道數組下標是從0開始的,所以a[255]前面的元素個數為255個,那么輸出為255就很好解釋了。

這個題仔細分析其實很簡單,但是一不小心就上當了,因此,我們在看待問題是一定要考慮全面,不要輕易下結論。

總結

以上是生活随笔為你收集整理的乱入的'\0'的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。