打印

求嵌入式高手指点!指针问题!

[复制链接]
2078|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
北京户口|  楼主 | 2009-12-19 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么
char str[] = “Hello” ; sizeof (str ) = 6
然而
void *p = malloc( 100 ); sizeof ( p ) = 4
void Func ( char str[100])
  {   sizeof( str ) = 4   }
为什么第一个分配6个大小就是6,而后面只按照指针大小计算为4?第一个str难道不可以看作是指向首地址的指针吗?

相关帖子

沙发
6019实验室| | 2009-12-19 15:39 | 只看该作者
楼主,我肯定的告诉你:千万不要把数组名看成指针,尽管有些时候他们是相通的,但也仅限某些时候而已。

sizeof是一个奇特的函数,告诉你你也许不相信——sizeof在编译的时候就已经确定sizeof的结果了,这有点类似于宏。

char str[] = “Hello” ; sizeof (str ) = 6
编译器编译的时候根据上下文完全知道str是一个数组,sizeof (str ) = 6 理所当然是在求数组所占字节数,这个字节数在编译期间就可以确定(数组的大小必须在编译前指定好,C语言规定)

void *p = malloc( 100 ); sizeof ( p ) = 4
编译器看到p是个指针,可是谁能保证指针所指内存的大小呢?尽管你这里写着100,但是malloc可是动态分配,没人敢保证malloc一定返回100个字节,甚至比如你不调用malloc,调用一个自己写的函数,编译器总之是无法在编译期间就确定指针所指内存大小的,而sizeof又必须在编译期间知道结果,那好,sizeof只好返回指针本身所占内存的大小,32位机上是4个字节,64位机上是8个字节。


void Func ( char str[100])
  {   sizeof( str ) = 4   }
数组作为参数时,编译器在编译期间一律编译为指针,这样尽管你定义str为数组,实际上在编译器眼里后等同于:
void Func ( char * str)
  {   sizeof( str ) = 4   }
记住,数组作为参数时,一律被编译器编译为指针。

使用特权

评论回复
板凳
yoyowodeai| | 2009-12-19 16:06 | 只看该作者
那ls能说一下在什么时候数组名和指针不同!

使用特权

评论回复
地板
huzixian| | 2009-12-19 16:11 | 只看该作者
在其他链接文件中即是:extern  声明中数组和指针不同!那么LZ这种情况又属于一种什么情况呢,希望高手总结一下!

使用特权

评论回复
5
虎虎生威| | 2009-12-19 23:21 | 只看该作者
2楼的真是耐心啊,楼主你要好好感谢人家

使用特权

评论回复
6
米其林r| | 2009-12-20 21:18 | 只看该作者
恩,2楼真是好人,学习了,谢谢

使用特权

评论回复
7
易达口香糖| | 2009-12-21 23:20 | 只看该作者
2楼高手怎么不解释一下3楼的问题啊?在什么时候数组名和指针不同!

使用特权

评论回复
8
NXP_MCU| | 2009-12-22 21:37 | 只看该作者
大家找一本C语言基本入门书,就能了解其中的奥秘了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

107

主题

521

帖子

1

粉丝