#include
#include
void main()
{
char *str();
char *p=str();
int m = sizeof(p);
int n = sizeof(*p);
}
char *str()
{
char strsize[]="Hello";
return strsize;
}
这是原题,大概意思是用一指针指向某字符串,而这个字符串是子函数里的。赋值可行吗?
答题时我通过筛除选项证明了赋值可行,接下来就正式进入计算问题:
p是一个指针,它表明一个内存地址(其值常见如:0XF32F980A),在WinXP VC6.0下占用32bit,即m=4(Byte).
而*p则访问的是一个char值,这里是H。故n=1.
这 里 是 分 隔 线
同样的,如果上面代码中,strsize是一个INT数组,其他代码作相应修改,那么,m值不变,n变成4,代表一人INT型数据占用4字节存储空间。
这 里 是 分 隔 线
下面是另一道面试题,我的同学遇到了,同样的是sizeof的陷阱!代码如下(感谢我的同学,博主wencheng2998):
#include "stdio.h"
#include "stdlib.h"
int main(int argc, char* argv[])
{
char ch1 = 'a';
char ch2[] = "hello";
char ch3[1000] = "luxer_forever!";
int chint[20]={5,4,3,2,1};
int int1 = sizeof(ch1);
int int2 = sizeof(ch2);
int int3 = sizeof(ch3);
int int4 = sizeof(chint);
puts(ch2);
printf("%d/n",int1);
printf("%d/n",int2);
printf("%d/n",int3);
return 0;
}
ch2,涉及到字符数组的地址即首个元素的地址,一度让我觉得sizeof(ch2)=4,因为ch2也是一个类似于0X0012FF74的值,这不就是一个内存地址吗?那它占用的空间当然就是4了。
可实际上,通过访问数组名可以访问全体数组元素,这在ch3这个极端的例子得到体现!
因此,“sizeof(数组名)”表达的就是:数组元素*单个元素占用的存储空间大小!
比如上面的代码中,int3=1000*1=1000, int4=20*4=80.