C/C++語言中sizeof對於數組的一點總結

最近在面試中被問到了幾個有關sizeof的問題,自我感覺都回答對了,不過回來實際編寫代碼試了一下,發現還是錯了一個地方,於是總結了一下。

棧中的數組

對於棧中的數組,sizeof給出的會是實際的數組長度,而非指針長度。

#include <string.h>
#include <stdio.h>

int main() {
    char a[5]= "blue";
    char b[ ] = "blue";
    char c[6] = "blue";
    printf("sizeof(a): %d\n", sizeof(a));
    printf("sizeof(b): %d\n", sizeof(b));
    printf("sizeof(c): %d\n", sizeof(c));
    return 0;
}
程序結果
sizeof(a): 5
sizeof(b): 5
sizeof(c): 6
 

指向數組的指針

當是一個指向數組(堆中,棧中或數據區的數組)的指針變量時,sizeof的結果將會是一個指針變量的長度,比如在32位機下將會是4.

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    char ca[ ] = "blue1";
    char *a = "blue1";
    char *b = (char *)malloc(6 * sizeof(char));
    char *c = ca;
    strcpy("blue1", b);
    printf("sizeof(a): %d\n", sizeof(a));
    printf("sizeof(b): %d\n", sizeof(b));
    printf("sizeof(c): %c\n", sizeof(c));
    free(b);
    return 0;
}
    
程序結果
sizeof(a): 4
sizeof(b): 4
sizeof(c): 4

全局變量

對於全局變量中數組,sizeof的處理結果和在棧中的數組一樣,會輸出其實際的數組長度,而非一個指針變量的長度。對於全局變量中的指向數組的指針sizeof的處理方式爲返回一個指針變量的長度。

#include <string.h>
#include <stdio.h>

char a[5]= "blue";
char b[ ] = "blue";
char c[6] = "blue";
char *d = "blue";
char *e = a;

int main() {
    printf("sizeof(a): %d\n", sizeof(a));
    printf("sizeof(b): %d\n", sizeof(b));
    printf("sizeof(c): %d\n", sizeof(c));
    printf("sizeof(d): %d\n", sizeof(d));
    printf("sizeof(e): %d\n", sizeof(e));
    return 0;
}

 

程序結果
sizeof(a): 5
sizeof(b): 5
sizeof(c): 6
sizeof(d): 4
sizeof(e): 4

函數參數

對於函數參數,無論是寫成數組形式還是指針形式,sizeof都只會返回一個指針變量的長度。

#include <stdio.h>

void printsize1(char argv[]) {
    printf("%d\n", sizeof(argv));
 }

void printsize2(char *argv) {
    printf("%d\n", sizeof(argv));
}

int main() {
    char a[] = "blue1";
    char *b = "blue1";
    printf("printsize1(a): ");
    printsize1(a);
    printf("printsize2(a): ");
    printsize2(a);

    printf("printsize1(b): ");
    printsize1(b);
    printf("printsize2(b): ");
    printsize2(b);

    return 0;
}
    
 
程序結果
printsize1(a): 4
printsize2(a): 4
printsize1(b): 4
printsize2(b): 4
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章