在32位WinNT操作系统环境下,有如下代码:
c
1 char str\[\] = "Hello";
2 char *p = str;
3 int n = 10;
4 sizeof(str) = ____;
5 sizeof(p) = ____;
6 sizeof(n) = ____;
7 void Func ( char str100 )
8 {
9 sizeof(str) = ____;
10 }
11 void *p = malloc(100);
12 sizeof(p) = ____;
解析
程序代码说明如下。
□ 代码第4行,str变量表示数组,对数组变量做sizeof运算得到的是数组占用的总空间。注意,数组最后有一个元素保存字符串结束符,所以 sizeof(str)=strlen("Hello")+1 。
□ 代码第5行和第6行中的p和n分别是指针型变量和int型变量。在32位平台下,两者都占4个字节的空间,所以结果都是4。
□ 代码第9行中的str是函数的参数,它在做sizeof运算时被认为是指针。因为调用函数Func(str)时,数组是"传址"的,程序会在栈上分配4字节来指向数组,因此结果也是4。
□ 代码第11行中的p首先指向100字节的内存, sizeof(p) 结果是4。
运行结果:(32位系统)
-
sizeof(str) = 6
-
sizeof(p) = 4
-
sizeof(n) = 4
-
函数内 sizeof(str) = 4
-
sizeof(p) (malloc那行)= 4
分析:
-
数组定义处, sizeof(数组名) 得到数组总字节,不会退化为指针; "Hello" 自带 \0 ,5个字符+结束符=6字节。
-
数组作为函数形参,直接退化为指针,sizeof只能得到指针大小。
-
32位系统所有指针都是4字节,与指针类型无关。