【问题标题】:C - Find the size of structureC - 查找结构的大小
【发布时间】:2011-11-15 00:45:48
【问题描述】:

我被问到这个面试问题。无法回答。

编写一个 C 程序来查找结构的大小,而不使用 sizeof 运算符。

【问题讨论】:

  • 是的——我们做了很多
  • 我认为你的面试官有点傻,你应该对在那里工作持怀疑态度。这有什么作用?
  • 结构体的大小是否可以小于它在数组中所占的大小?
  • @Martin ...我不明白。 :)
  • @muntoo - 刚刚提出的原始问题“有人知道怎么做吗”

标签: c pointers structure


【解决方案1】:
struct  XYZ{
    int x;
    float y;
    char z;
};

int main(){
    struct XYZ arr[2];
    int sz = (char*)&arr[1] - (char*)&arr[0];
    printf("%d",sz);
    return 0;
}

【讨论】:

  • 一个元素(或单个对象)的数组就足够了,因为在数组的末尾计算地址是合法的。
  • @JorgeIsraelPeña:它只取数组中第一个元素的内存地址(指针)和第二个元素的地址之间的差异。
  • @Pablo:谢谢,我就是这么想的 :)
【解决方案2】:

这是另一种方法。 它也没有完全定义,但仍然适用于大多数系统。

typedef struct{
    //  stuff
} mystruct;

int main(){
    mystruct x;
    mystruct *p = &x;

    int size = (char*)(p + 1) - (char*)p;
    printf("Size = %d\n",size);

    return 0;
}

【讨论】:

  • 你认为这个程序的哪一部分“没有完全定义”?
  • 我收回了。我的印象是在类型转换之后进行算术是未定义的。
  • 你应该使用size_t,否则这是非常完整的定义。
  • @Chris:除了 C89 不需要 long long(和 "%llu"):-)
  • @Chris: %llu 在 C89 中甚至不存在。 %lu 转换为 unsigned long 可能没问题;这是你能为 C89 做的最好的事情。
【解决方案3】:

以下是sizeof 的两种形式的两个宏版本(接受类型与接受变量),您可以将它们用于您永远不会编写的所有代码,而这些代码不允许您使用sizeof

#define type_sizeof(t) (size_t)((char *)((t *)1024 + 1) - (char *)((t *)1024))
#define var_sizeof(v)  (size_t)((char *)(&(v) + 1) - (char *)&(v))

也许通过一些深奥的魔法,您可以将两者组合成一个宏,几乎可以作为所有这些sizeof-less 代码的替代品。 (很遗憾,您无法修复多重评估错误。)

【讨论】:

    【解决方案4】:

    这是另一种方法....无需创建任何结构实例。

    struct  XYZ{
        int x;
        float y;
        char z;
    };
    
    int main(){
        int sz = (int) (((struct XYZ *)0) + 1);
        printf("%d",sz);
        return 0;
    }
    

    它是如何工作的?

    ((struct XYZ *)0) + 1 = zero + size of structure
                          = size of structure
    

    【讨论】:

    • 美的说!
    【解决方案5】:

    对于喜欢 C 宏风格编码的人,这是我的看法:

    #define SIZE_OF_STRUCT(mystruct)     \
       ({ struct nested_##mystruct {     \
             struct mystruct s;          \
             char end[0];                \
          } __attribute__((packed)) var; \
          var.end - (char *)&var; })
    
    void main()
    {
       struct mystruct {
          int c;
       };
    
       printf("size %d\n", SIZE_OF_STRUCT(mystruct));
    }
    

    【讨论】:

      【解决方案6】:
      struct ABC
      {
          int a, b[3];
          int c;
          float d;
          char e, f[2];
      };
      int main()
      {
          struct ABC *ptr=(struct ABC *)0;
          clrscr();
          ptr++;
          printf("Size of structure is: %d",ptr);
          return 0;
      }
      

      【讨论】:

        【解决方案7】:
        struct  ABC
        
        {
        
        int a;
        
        float b;
        
        char c;
        
        };
        
        
        void main()
        {
        
        struct ABC *ptr=(struct ABC *)0;
        
        ptr++;
        
        printf("Size of structure is: %d",*ptr);
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-09
          • 1970-01-01
          • 2015-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多