sizeof是關鍵字,不是函數,因此sizeof不能計算動態申請的內存大小,只能計算靜態數組的大小。
看一段代碼,buffer是否可以被清0?f2沒有把長度傳遞進來
void f2(char buffer[10])
{
std::cout << "sizeof(buffer)" << sizeof(buffer) << std::endl;
memset(buffer, 0, sizeof(buffer));
}
int main()
{
char buffer[10];
cout << "main sizeof(buffer)" << sizeof(buffer) << endl;
f2(buffer);
return 0;
}
輸出爲
main sizeof(buffer)10
sizeof(buffer)4
爲什麼在main中是10,在f2中是4呢?
10是數組的長度,4是指針的大小。前面講到了sizeof是一個關鍵字,對靜態數組可計算,在編譯時已經算出來大小了,注意是數組的字節數,不是數組長度。
當buffer作爲參數傳遞到f2時,並沒有如“預期”的把值拷貝過去,因爲f2(buffer),入參是指針,所以f2(char buffer[10]) 退化成了f2(char *buffer)。在f2中有了buffer的地址,是可訪問數組中的內容,但是在f2中並沒有數組長度,怎麼訪問所有的數組內容呢?
f2的代碼可以修改成
1、帶數組長度
void f2(char buffer[],int len)
或者
void f2(char *buffer,int len)
2、使用引用
void f2(char (&buffer)[10])
這樣的話,傳入的參數必須與f2的參數列表保持一致,否則會因爲傳入的參數與函數參數不一致出錯。
學習:
int main()
{
int a[4] = {1,2,3,4};
int * a_ptr = (int *)(&a +1);
cout<< *(a+1) << ' '<< *(a_ptr-1) <<endl;
return 0;
}
輸出
2 4
原因是這樣:a在這裏仍然是靜態數組 {1,2,3,4}的首個元素的地址,所以*(a+1)就是把a移動到下一個元素,解引用後輸出,很好理解;然而&a代表的是整個長度爲4個元素的數組。所以 &a +1 並不是單純地移動到下一個元素,而是根據數組的長度移動數組長度個單位,即此時 &a +1指向的是4後面的元素(溢出),所以最後 *(a_ptr-1)輸出的就是最後一個元素4了。
————————————————
版權聲明:本文爲CSDN博主「cclaibryan」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/bryanlai0720/article/details/23610835
按照參考文檔中的說明,&a是代表的整個數組地址,+1也是在原有的整個數組上+1,這個不太理解。
“
”
參考文章:
https://blog.csdn.net/u014801596/article/details/79141493
https://blog.csdn.net/bryanlai0720/article/details/23610835