2011-11-16 46 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