读书人

关于sizeof的有关问题

发布时间: 2012-11-07 09:56:10 作者: rapoo

关于sizeof的问题
#include<stdio.h>
#include<string.h>

void func(char str[50])
{
printf("A %d B %d ",sizeof(str), strlen(str));
}
int main(void)
{
char stra[] = "HelloWorld";
char *strb = stra;
printf("M=%d ",strb);
int b=sizeof(++strb);
printf("C %d D %d ",sizeof(stra), b);
printf("N=%d ",strb);
func(++strb);
printf("O=%d ",strb);
printf("E %d F %d\n",strlen(stra), strlen(strb++));
return 0;
}

运行的结果:
M=2293600 C 11 D 4 N=2293600 A 4 B 9 O=2293601 E 10 F 9

想知道 为何 sizeof(++strb) 指针地址没有变化呢



[解决办法]
sizeof() 只会做字节大小的计算,不会对表达式进行运算的,

例如;

int a = 4;
sizeof( ++a ) = 4;
结果a = 4不变的。
[解决办法]
sizeof 是求类型大小,都是指针,大小恒定
[解决办法]
根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, int b=sizeof(++strb); 在编译的时候被翻译成 sizeof(++strb的数据类型), 然后才会继续编译成最终的程序,当然在最终程序执行的时候,自然不会执行任何++strb了。
[解决办法]
sizeof操作符中的表达式不会被计算,它仅仅获取表达式的返回类型的大小
[解决办法]
sizeof 是静态编译期计算的,因此不会执行运行期动作
[解决办法]
   指针变量的sizeof
 指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。
  char* pc = "abc";
  int* pi;
  string* ps;
  char** ppc = &pc;
  void (*pf)();// 函数指针
  sizeof( pc ); // 结果为4
  sizeof( pi ); // 结果为4
  sizeof( ps ); // 结果为4
  sizeof( ppc ); // 结果为4
  sizeof( pf );// 结果为4
  指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。

读书人网 >C语言

热点推荐