首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

sizeof(数组指针)的有关问题

2012-03-22 
sizeof(数组指针)的问题为什么char str[] “Hello” sizeof (str ) 6然而void *p malloc( 100 ) si

sizeof(数组指针)的问题
为什么
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难道不可以看作是指向首地址的指针吗?

[解决办法]
指针和数组是不一样的,但数组做为参数传递时就会退化为同类型的指针.
[解决办法]

C/C++ code
有2个原则:对数组sizeof是数组的大小;对指针sizeof是指针的大小(4);char str[] = “Hello” ; sizeof (str ) = 6 void *p = malloc( 100 ); sizeof ( p ) = 4 //上面2个就好解释了;void Func ( char str[100])   {   sizeof( str ) = 4   } 这个其实传进来的是个指针.
[解决办法]
楼主,我肯定的告诉你:千万不要把数组名看成指针,尽管有些时候他们是相通的,但也仅限某些时候而已。

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   } 
记住,数组作为参数时,一律被编译器编译为指针。

热点排行