sizeof與數組

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章