zoukankan      html  css  js  c++  java
  • 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组

    这一章在第19页,写的好深奥,我竟然没看明白在说什么~~之后再看了几遍,终于明白了。

    原文:

    C程序员的巧计有时候却成为c++程序员的陷阱。例如把单一元素的数组放在一个struct的末尾,于是每个struct objects可以拥有可变数组的数组:
    struct mumble
    {
          /* stuff */
          char pc[1];  
    };
    
    //从文件或标准输入装置中取得一个字符串
    //然后为struct 本身和该字符配置足够的内存
    
    struct mumble * pmumbl = (struct mumble*)
                 malloc(sizeof(struct mumble) + strlen(string) +1);
    strcpy(&mumble.pc,string);
    

      如此深奥,他到底想要表达什么?

      首先,结构体的末尾定义了一个char数组,只分配了1个字符。那怎么能说是可变大小数组。

      往下看,他用malloc函数分配了一堆的内存。大小为结构体+字符串+1(字符串结束符)如下图所示。

          

        通过strcpy,将string字符串拷贝给mumble.pc,pmumble已经分配了足够的内存,因此只要赋值即可,也就达到了可变大小数组的意思。

      但是,C++中的类可不同。      

    class stumble{
    public:
         //operations ...
    protected:
       //protected stuff
    private:
        /* private stuff */
        char pc[1];
    };
    

      C++中 public、protected、private内的声明顺序可以被保证,但是这三个关键字的布局是不同的。因此总的排列顺序并不能被保证。因此,不能实现struct的可变大小的数组。

      

  • 相关阅读:
    Leetcode: Find Median from Data Stream
    Leetcode: Flip Game II
    Leetcode: Flip Game
    Leetcode: Nim Game
    Leetcode: Word Pattern II
    Leetcode: Word Pattern
    Leetcode: Game of Life
    Leetcode: Alien Dictionary && Summary: Topological Sort
    Leetcode: Unique Word Abbreviation
    Leetcode: Find the Duplicate Number
  • 原文地址:https://www.cnblogs.com/yusenwu/p/5396025.html
Copyright © 2011-2022 走看看