sizeof问题

代码如下:inttest(charvar[]){returnsizeof(var);}intmain(){charaa[]="0123456789";inti=test(... 代码如下:
int test(char var[])
{
return sizeof(var);
}

int main()
{
char aa[]="0123456789";
int i=test(aa);
int j=sizeof(aa);
}
计算结果i=10,j=11。这是为什么啊?请教各位大侠!!!
调试的时候发现 sizeof(var)=4,然后又把int统统改为 unsigned int ,结果还是i=10,j=11
展开
 我来答
今生今灭
2011-04-16 · TA获得超过2747个赞
知道大有可为答主
回答量:1499
采纳率:50%
帮助的人:1541万
展开全部
我无论怎么调试都是 4 11
用运算符 sizeof 可以计算出数组的容量(字节数)。 sizeof(aa)
的值是 11(注意别忘了’ \0’ ) 。
test(aa)的值却是 4。这是因为
sizeof(var)得到的是一个指针变量的字节数,相当于 sizeof(char*).
C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。不论数组 aa 的容量是多少,sizeof(aa)始终等于 sizeof(char *)。
#include<stdio.h>
unsigned int test(char var[])
{
return sizeof(var);
}

int main()
{
char aa[]="0123456789";
unsigned int i=test(aa);
unsigned int j=sizeof(aa);
printf("%u %u\n",i,j);
}
也是 4 11
追问
我用的是vs2010也是无论怎么调都是10
追答
那应该就是编译器不同造成的..
VS2010可能进行优化了..
参数传递后不再是退化为同类型的指针..但却去掉了后面的'\0'..
wanfustudio
2011-04-17 · TA获得超过1万个赞
知道大有可为答主
回答量:5513
采纳率:100%
帮助的人:3771万
展开全部
那是编译器的问题

按照我们正常的理解,数组作为形参时会退化为指针,sizeof结果为4
我在borland c++ builder上结果为4,11

你要是实在看不出来可以右键,跳到汇编中看对应的指令,就会彻底明白了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qlc00
2011-04-16 · 超过37用户采纳过TA的回答
知道小有建树答主
回答量:71
采纳率:0%
帮助的人:109万
展开全部
sizeof(var)=4//这个是表示刚开始没有对var[]数组进行初始化,那么var就相当于一个指针,指针分配的空间是定值4,所以调试的时候显示的为4,在main函数中因为对aa字符数组进行初始化了,所以int i=test(aa);这句话就是相当于求数组的大小,char占一个字节,所以"0123456789"就为10个字节。j的11是因为char数组是以\0结尾的,所以也占一个字节,所以为11
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
porker2008
2011-04-16 · TA获得超过1.4万个赞
知道大有可为答主
回答量:7066
采纳率:62%
帮助的人:1.1亿
展开全部
在用VS2010的表示看到也是4 11. 楼主的VS哪下的 呵呵
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhongzunru
2011-04-16 · TA获得超过499个赞
知道小有建树答主
回答量:231
采纳率:0%
帮助的人:226万
展开全部
i应该是4吧,数组当成形参传入函数会退化为指针,指针的大小是跟机器有关,32位的机器,指针的大小是4。j是11,因为数组aa一共有11个元素,包括最后一个结束符‘\0’
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ningtukun
2011-04-16
知道答主
回答量:6
采纳率:0%
帮助的人:9103
展开全部
数组是“传址”的,调用者只需将实参的地址传递过去,所以var这里并不是一个数组类型,而是一个指向数组aa的地址,即var相当于一个整数,所以sizeof(var)=4;而字符数祖aa[]的元素还有一个‘\0’故aa[]的长度为11
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式