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时,它给出了实际的大小。为什么包含结构数组的第二个读取不会转换为指针作为其数组。
答案 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;