2011-11-16 51 views
0

EDITED的sizeof()嵌套结构阵列

#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时,它在结构数组以及嵌套结构数组中给出了实际大小。为什么包含结构数组的第二次读取没有被转换为指针作为其数组。

+1

你是什么意思*输出大小到大*? –

+3

不,尺寸是正确的。你只需要调整你的期望。 –

+1

您希望打印的尺寸是多少?你得到什么结果?你的平台是什么? – mizo

回答

3

你的问题并不完全清楚。

无论如何,首先,当数组被隐式转换为指针时,它是标准的阵列到指针的转换这是负责。 阵列到指针的转换隐式应用于某些上下文中,但不是在所有上下文中。例如,阵列到指针的转换不适用于sizeof的操作数,这就是为什么sizeof(当与数组一起使用时)正确求值到数组大小(而不是指针大小)的原因。其他a[0]不是数组。 a是一个数组。 a[0]是一个num对象,它根本不是数组。所以,为什么你期望a[0]被转换成指针是完全不清楚的。

+0

谢谢安德烈。我怀疑当计算作为参数传递的数组的大小时,是否发生指向数组的指针转换。 – Angus

+0

@Angus:这取决于你的意思是“数组作为参数传递”。将数组作为参数传递有不同的方法。无论如何,在你的代码示例中没有数组作为参数传递。 – AnT

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; 
+0

反对的任何理由? – shenles