sizeof 的退化问题

前言


 

  首先来看一道例题,如果你会了就不用往下看了

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

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

int main() {
    char *s = "1234567890";
    test1(s);
    char s2[10] = sizeof(s2);
    printf("%d\n", sizeof(s2));
    char s3[10];
    printf("%d\n", sizeof(s3));    
    return 0;
}

 

解答


 

  在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符,它返回一个对象或者是类型所占的内存字节数。所以,在 main 函数中打印的 s3 是 10。

  但是 test1 中打印的 s 与 test2 中打印的 s2 并不是字符串的长度 10。因为test1 与 test2 函数传参时是地址传递(指针传递),所以此时 sizeof 的作用对象实际上是指针而不是原来的字符串或者是数组,因为指针一般是 4 字节 或者是 8 字节,所以在 test1 、test2 中打印出来的值都是8。这就是所谓的sizeof 退化问题。

 

posted @ 2017-12-30 20:26  bw98  阅读(311)  评论(0)    收藏  举报