C/C++中sizeof的一点总结

栈中的数组

对于栈中的数组,sizeof给出的会是实际的数组长度,而非指针长度。

    #include <string.h>  
    #include <stdio.h>  
      
    int main() {  
        char a[7]= "heqing";  
        char b[ ] = "heqing";  
        char c[8] = "heqing";  
        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): 7
sizeof(b): 7
sizeof(c): 8

指向数组的指针

当是一个指向数组(堆中,栈中或数据区的数组)的指针变量时,sizeof的结果将会是一个指针变量的长度,比如在32位机下将会是4.

#include <string.h>  
#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    char ca[ ] = "heqing";  
    char *a = "heqing";  
    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[7]= "heqing";  
    char b[ ] = "heqing";  
    char c[8] = "heqing";  
    char *d = "heqing";  
    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): 7
sizeof(b): 7
sizeof(c): 8
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

推荐阅读更多精彩内容