c/c++语言开发共享在C中使用sizeof()运算符时出现奇怪的情况

我正在使用以下代码测试在C / C ++中使用sizeof运算符:

#include  /* Character types */ #include  /* Standard buffered input/output */ #include  /* Standard library functions */ #include  /* String operations */ #include  /* Data types */ #include  /* Declarations for waiting */ #include  void main() { char a[100]; char *des = malloc(100*sizeof(char)); strcpy(des,"abcded"); printf("%dn",sizeof(des)); printf("%dn",sizeof(a)); free(des); } 

为什么这个程序输出:

 4 100 

相反:

 100 100 

    因为, 尽管很多人都断言指针和数组在C&C ++中并不是100%可互换的。 这是其中一个差异的明显例子。

    指针的大小是4个字节(或任何平台特定的大小),无论它指向多少分配的内存。

    数组的大小是数组的大小。

    sizeof(des)返回指针的大小 – 在系统上为4。 它不会返回它指向的已分配空间的大小。

    因为它返回指向分配的内存的指针des的大小。

     printf("%dn",sizeof(des)); printf("%dn",sizeof(a)); 

    相当于以下内容:

     printf("%dn",sizeof(char*)); //prints size of a pointer printf("%dn",sizeof(char[100])); //size of a char array of size 100 

    换句话说, sizeof是一个操作符,它根据您传递给它的表达式的类型进行操作。 因此,当您编写sizeof(des)时,表达式的类型char* ,因此它会在系统上打印sizeof(char*) ,它是4 。 但是在sizeof(a)情况下,表达式的类型是char[100] ,因此它打印sizeof(char[100]) ,即100

    这里讨论一个更有趣的sizeof案例:

    sizeof运算符产生no。 一个类型的字节数。

    sizeof des给出100,因为des的类型是char[100] ,char总是占用1个字节,其中有100个。

    sizeof a给出4,因为a的类型是char* ,并且char指针在您的平台上占用4个字节(这在32位平台上是典型的。)

    因此,sizeof只适用于它的操作数类型(注意,sizeof是一个运算符,它不是一个函数/宏)。 sizeof不与malloc交互,并且指向100个动态分配字节的开头的事实是无关紧要的。

    我将详细阐述abelenky的评论。 您是否期望这两个typedef产生等效类型?

     typedef char *string; typedef char string[100]; 

    这两个怎么样?

     typedef struct { char *s; ... } header_t; typedef struct { char s[100]; ... } header_t; 

    在这两种情况下,你的答案显然是否定的 是的,你可以编译des=a因为a产生指针,但a实际上是一个数组。

    特别是,您也知道最后一个typedef为指针保留了无内存。 结果, a大致具有char * const类型,意味着a是指向非常量字符的常量指针,因此a=des给出类型错误。 我不知道如果说错误消息会抱怨数组, const或左值。

    答案很简单。

    des的类型是“char *”或字符的地址。 因此,使用sizeof询问编译器的问题是“存储字符地址需要多少内存(以字节为单位)?” 编译器响应4,因为您的程序和编译器具有32位(4字节)寻址。 当你在一个数组上使用sizeof时,你会问一个不同的问题,即“我需要多少内存(以字节为单位)来存储100个项目的字符数组?” 这里的答案是100项* 1字节= 100字节。

      以上就是c/c++开发分享在C中使用sizeof()运算符时出现奇怪的情况相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519051.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐