关于sizeof的问题

时间:2023-01-29 18:50:24
#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) 指针地址没有变化呢

10 个解决方案

#1


sizeof() 只会做字节大小的计算,不会对表达式进行运算的,

例如;

int a = 4;
sizeof( ++a ) = 4;
结果a = 4不变的。 

#2


sizeof 是求类型大小,都是指针,大小恒定

#3


根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, int b=sizeof(++strb); 在编译的时候被翻译成 sizeof(++strb的数据类型), 然后才会继续编译成最终的程序,当然在最终程序执行的时候,自然不会执行任何++strb了。

#4


sizeof操作符中的表达式不会被计算,它仅仅获取表达式的返回类型的大小

#5


sizeof 是静态编译期计算的,因此不会执行运行期动作

#6


如楼上

#7


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

#8


   1.对于指针,sizeof(指针对象)操返回这个指针占的空间,一般是4个字节;
      对于一个数组,sizeof(数组)返回这个数组所有元素占的总空间。
       sizeof()函数会将最后字符串的结束符“\0”也作为一个字符计算在内!
   2.strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。

#9


指针就是4字节哈

#10


谢啦! 最近在做C语言的笔试题 还真多平时不注意的问题

#1


sizeof() 只会做字节大小的计算,不会对表达式进行运算的,

例如;

int a = 4;
sizeof( ++a ) = 4;
结果a = 4不变的。 

#2


sizeof 是求类型大小,都是指针,大小恒定

#3


根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, int b=sizeof(++strb); 在编译的时候被翻译成 sizeof(++strb的数据类型), 然后才会继续编译成最终的程序,当然在最终程序执行的时候,自然不会执行任何++strb了。

#4


sizeof操作符中的表达式不会被计算,它仅仅获取表达式的返回类型的大小

#5


sizeof 是静态编译期计算的,因此不会执行运行期动作

#6


如楼上

#7


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

#8


   1.对于指针,sizeof(指针对象)操返回这个指针占的空间,一般是4个字节;
      对于一个数组,sizeof(数组)返回这个数组所有元素占的总空间。
       sizeof()函数会将最后字符串的结束符“\0”也作为一个字符计算在内!
   2.strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。

#9


指针就是4字节哈

#10


谢啦! 最近在做C语言的笔试题 还真多平时不注意的问题