这是怎么算出来的

wuyan16001 2008-09-04 10:16:27
遇到以下问题

大题目:以下为windows NT下的32位c++程序,请计算sizeof的值

char str[] = "hello";
char *p = str;
int n = 10;

则:
Q1.
sizeof(str) = 6
sizeof(p) = 4
sizeof(n) = 4

Q2.
void func(char str[100])
{
sizeof(str) = 4;
}


Q3
void *p = malloc(100);
sizeof(p) = 4

以上Q1--3是问题的结果,小生除了sizeof(n0 = 4知道外,就搞不懂了。
1.为什么他们会有这样的长度结果?
2.为什么前后两个sizeof(str)结果有差异,而sizeof(p)前后却一样?

请高手指点迷津

...全文
132 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mifeixq 2008-09-05
  • 打赏
  • 举报
回复
无论什么类型的指针,都是一个机器字长~~32位机,就是32位
int类型在32位机是16/32 通常都是32
至于函数那个,数组作参数的时候,其实传递的是指针,可以就看成一个指针~故也是32位
kangken 2008-09-04
  • 打赏
  • 举报
回复
sizeof(str) = 6 //5个字符加上一个'\0'共6个字节
sizeof(p) = 4 //p是个指针,指针的长度是4
sizeof(n) = 4 //n是int整形,长度是4

//Q2.
void func(char str[100])
{
sizeof(str) = 4; //数组做参数,退化为指针,此时得出的指针的长度,是4;char(&str)[100]这么写不退化
}


//Q3
void *p = malloc(100);
sizeof(p) = 4 //同样的道理,得出的指针的长度,与分配的内存空间大小无关,那是p指向的,而这求的p的长度,是4



3楼正解!
  • 打赏
  • 举报
回复
哦,LS 的解释让俺有点明白了。
指针长度不受分配的内存空间影响,如果是
char str[] = "hello world";
char *p = str;


sizeof(p) 结果还是不变吗?不受字符串的长度影响吗?


不一样,一个表示的是字符数组,一个表示的是指向字符的指针.
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangdeqie 的回复:]
C/C++ code
//楼主用的是VC6吧
//Q1.
sizeof(str) = 6 //5个字符加上一个'\0'共6个字节
sizeof(p) = 4 //p是个指针,指针的长度是4
sizeof(n) = 4 //n是int整形,长度是4

//Q2.
void func(char str[100])
{
sizeof(str) = 4; //数组做参数,退化为指针,此时得出的指针的长度,是4;char(&str)[100]这么写不退化
}


//Q3
void *p = malloc(100);
sizeof(p) = 4 //同样的道理,得出的指针的长度,与分…



这个很详细!
[/Quote]
wuyan16001 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangdeqie 的回复:]
C/C++ code
//楼主用的是VC6吧
//Q1.
sizeof(str) = 6 //5个字符加上一个'\0'共6个字节
sizeof(p) = 4 //p是个指针,指针的长度是4
sizeof(n) = 4 //n是int整形,长度是4

//Q2.
void func(char str[100])
{
sizeof(str) = 4; //数组做参数,退化为指针,此时得出的指针的长度,是4;char(&str)[100]这么写不退化
}


//Q3
void *p = malloc(100);
sizeof(p) = 4 //同样的道理,得出的指针的长度,与分…
[/Quote]


哦,LS 的解释让俺有点明白了。
指针长度不受分配的内存空间影响,如果是
char str[] = "hello world";
char *p = str;


sizeof(p) 结果还是不变吗?不受字符串的长度影响吗?
wuyan16001 2008-09-04
  • 打赏
  • 举报
回复
呵呵,这个 = 此时不是赋值的意思啦
wuyan16001 2008-09-04
  • 打赏
  • 举报
回复
哦,LS 的解释让俺有点明白了。
指针长度不受分配的内存空间影响,如果是
char str[] = "hello world";
char *p = str;


sizeof(p) 结果还是不变吗?不受字符串的长度影响吗?
guolisen 2008-09-04
  • 打赏
  • 举报
回复
晕。。。知道了。。。。
guolisen 2008-09-04
  • 打赏
  • 举报
回复
sizeof(str) = 4;

菜鸟请问。。。这个成立吗?sizeof(str)不是一个数吗,怎么把4赋值给他?
bitxinhai 2008-09-04
  • 打赏
  • 举报
回复
Q1.
sizeof(str) = 6 //字符串最后有一个‘\0’,占用一个字节
sizeof(p) = 4 \\指针是一个32比特的无符号数
sizeof(n) = 4

Q2.
void func(char str[100])
{
sizeof(str) = 4; \\数组作为参数,退化为指针
}


Q3
void *p = malloc(100);
sizeof(p) = 4 \\指针是一个32比特的无符号数
星羽 2008-09-04
  • 打赏
  • 举报
回复
32 位系统上指针大小是 32bit也就是4byte


当数组做为参数的时候会退化为指针
_石头_ 2008-09-04
  • 打赏
  • 举报
回复
分析下列问题前,lz先要明白一点,就是sizeof()对任何变量的运算,实际上都是对该变量的类型的运算。

char str[] = "hello"; // 此时实际上就是 char str[6]={'h','e','l','l','o','\0'},所以str的类型是: char [6];
char *p = str; // 这个很明显: p的类型是 char * ;
int n = 10; // n的类型是: int;

则:
Q1.
sizeof(str) = 6 实际上就是 sizeof(char [6])=6 -----数组的宽度
sizeof(p) = 4 ..........sizeof(char *)=4 -------指针的宽度,仅于及其的地址线宽度有关,在数值上等于sizeof(int)
sizeof(n) = 4 ..........sizeof(int)=4

Q2.
void func(char str[100])
{
sizeof(str) = 4; // 函数的形参中的数组会退变为指针,所以实际上就是 sizeof(char *)=4
// 数组名不能进行++ ,--,+=,-=等运算,此时的str却可以,证明它不是数组
}


Q3
void *p = malloc(100);
sizeof(p) = 4 -----------指针的宽度!==sizof(int)
9527他大爷 2008-09-04
  • 打赏
  • 举报
回复
p是指针,32位系统都是4,n是整形32位系统也是4
对于str,Q1中它是字符数组,字符串结尾以'\0'结尾所以是6,Q2中虽然它看起来是字符数组,在数组做参数时都退化为指针,所以它是4
wangdeqie 2008-09-04
  • 打赏
  • 举报
回复

//楼主用的是VC6吧
//Q1.
sizeof(str) = 6 //5个字符加上一个'\0'共6个字节
sizeof(p) = 4 //p是个指针,指针的长度是4
sizeof(n) = 4 //n是int整形,长度是4

//Q2.
void func(char str[100])
{
sizeof(str) = 4; //数组做参数,退化为指针,此时得出的指针的长度,是4;char(&str)[100]这么写不退化
}


//Q3
void *p = malloc(100);
sizeof(p) = 4 //同样的道理,得出的指针的长度,与分配的内存空间大小无关,那是p指向的,而这求的p的长度,是4

wuyu637 2008-09-04
  • 打赏
  • 举报
回复
p是一个指针,一个指针就是一个机器字长,32位,就是4字节。无论这个指针指向的是什么东西,它就是一个32位的数字。

str是一个字符串数组,字符串数组是以\0做结尾的,所以str里一共有5+1个字符,一个字符就是1字节。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧