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

关于sizeof的有关问题

2012-11-07 
关于sizeof的问题#includestdio.h#includestring.hvoid func(char str[50]){printf(A %d B %d ,size

关于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就能传递各种复杂的消息结构(使用指向结构体的指针)。

热点排行