strlen()関数に対するちょっとした疑問

1734 ワード

csappを見るときは、char*[8]を見て、char*も1バイトだと思っていましたが、ポインタはアドレス、64ビットコンパイラの下は8バイトなのでsizeof(B)は64バイトです
後でstrlen()も見ました.
 
1 #include"stdio.h"
2 #include"string.h"
3 int main(void){
4     char B[8];5     printf("%d",strlen(B));
6 
7 return 0;
8 }

 
運転後、結果が見つかり、ちょっとおかしいです.0だったり、6だったりします.
strlenは配列長を計算するときに‘0’に遭遇したときに計算を停止する.
文字配列の後ろに「0」を付けないと、strlenはメモリの'0'に遭遇するまで計算を停止します.
メモリのどこかに'0'が存在し、strlenが'0'に遭遇したときに長さの計算を停止するため、計算された長さは文字配列の真の長さではなく、この値はランダムであることがわかります.
次のように説明します.
1.配列にstrlen()を使用する場合は、配列に0の終端があることを確認します.
2.strncpyなどの操作を連想し、strlen後の長さで文字列をコピーする場合は、末尾に0を付けることを忘れないでください.
実は、このような関数ごとに、初期化されていない配列を操作するには、このようなリスクがあります.これは私たちの開発過程で重点的に注意する必要があります.