嵌套结构数组的sizeof()

时间:2011-11-16 03:41:30

标签: c

EDITED

#include<stdio.h>
typedef struct ns{
 int sd;
 int we;
 char st;
 int m;
}ds;
typedef struct numb
{
  char b;
  ds rt;
}num;
static num a[]={1,'a'};
int read(int number)
{
 printf("%d\n",number);
 return 1;
}
int main()
{
    printf("%d",sizeof(a[0].rt));
    read(sizeof(a[0].rt));
    read(sizeof(a[0]));
    return 0;
}

我怀疑是数组的sizeof作为参数传递时会被修改为临时指针变量。但是在这里的结构数组以及嵌套结构的数组中,当试图打印sizeof时,它给出了实际的大小。为什么包含结构数组的第二个读取不会转换为指针作为其数组。

2 个答案:

答案 0 :(得分:3)

你的问题并不完全清楚。

无论如何,首先,当数组被隐式转换为指针时,标准的数组到指针转换负责这一点。 数组到指针转换在某些上下文中隐式应用,但并非在所有上下文中都应用。例如,数组到指针转换不应用于sizeof的操作数,这就是sizeof(与数组一起使用时)正确计算数组大小的原因(而不是指针大小)。

其次,a[0]不是数组。 a是一个数组。 a[0]num对象,根本不是数组。那么,为什么你期望a[0]转换为指针对我来说是完全不清楚的。

答案 1 :(得分:1)

您可能正在进行优化,大多数32位和64位编译器将执行以对齐结构中的项目。通常,每个元素都将填充到系统WORD大小(桌面上可能是32或64位,嵌入式mcu上可能是8/16)。这样系统就不必处理指向非对齐数据的指针,这通常是系统访问的额外工作。

您通常可以强制编译器“打包”您的结构,这样它们只会使用最小的空间量,但您基本上只需要几个字节的RAM来处理几个额外字节的代码空间,并且执行速度可能稍慢。这在RAM限制系统或处理通信协议的序列化数据时可能有意义。

另请注意,打包结构的方法因编译器而异,所以不要指望它在没有大量宏工作的情况下编译。

在GCC中,“打包”结构的方式是这样的:

typedef struct  __attribute__ ((__packed__))
{
   int a;
   char b;
   long long c;
   short d;
} PackedStruct;