前言
首先来看一道例题,如果你会了就不用往下看了
void test1 (char * s){ printf("%d ", sizeof(s)); } void test2 (char s2[]) { printf("%d ", sizeof(s2)); } int main() { char *s = "1234567890"; test1(s); char s2[10] = sizeof(s2); printf("%d ", sizeof(s2)); char s3[10]; printf("%d ", sizeof(s3)); return 0; }
解答
在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符,它返回一个对象或者是类型所占的内存字节数。所以,在 main 函数中打印的 s3 是 10。
但是 test1 中打印的 s 与 test2 中打印的 s2 并不是字符串的长度 10。因为test1 与 test2 函数传参时是地址传递(指针传递),所以此时 sizeof 的作用对象实际上是指针而不是原来的字符串或者是数组,因为指针一般是 4 字节 或者是 8 字节,所以在 test1 、test2 中打印出来的值都是8。这就是所谓的sizeof 退化问题。