[英]C - Is struct variable a pointer?
我搜索了很多,但我找不到任何關於此的話題。 我的問題是:struct變量是指針嗎? 如果每個輸入都存儲在struct members的地址中,那么struct變量用於什么?
這是我用來檢查struct變量的代碼,當我打印存儲在變量中的內容時,它給了我另一個地址,但我無法確定該地址的用途。
這是我的代碼及其輸出:
struct test
{
int a;
int b;
char c;
};
int main()
{
struct test f;
printf("%u", &f);
printf("\n%d", f);
printf("\n%u", &f.a);
printf("\n%u", &f.b);
}
輸出:
6487616
6487600
6487616
6487620
簡答: 不 。
長版本:上述程序中的所有print語句都會調用未定義的行為,因為提供的參數與轉換說明符不匹配。
要詳細說明,要打印指針,您需要使用%p
轉換說明符,並為參數使用%p
轉換為void *
。
結構變量沒有通用 ( 一對一排序 )格式說明符。 您需要選擇具有相應格式說明符的單個成員(或其成員),並將其作為參數傳遞。
也就是說,關於第一個成員和訪問,
[...]指向結構對象的指針(適當轉換)指向其初始成員(或者如果該成員是位字段,則指向它所在的單位),反之亦然。 [...]
struct變量是指針嗎?
不。給出結構定義:
struct test
{
int a;
int b;
char c;
};
和聲明:
struct test f;
你在內存中得到以下內容(假設4字節int
):
+---+ ---+
f: | | |
+---+ |
| | |
+---+ +--- f.a
| | |
+---+ |
| | |
+---+ ---+
| | |
+---+ |
| | |
+---+ +--- f.b
| | |
+---+ |
| | |
+---+ ---+
| | f.c
+---+
成員按照聲明的順序排列 - fa
占用對象的前四個字節, fb
占用接下來的四個字節, fc
占據最后一個字節。 可能存在額外的“填充”字節以滿足對齊要求(在這種情況下,編譯器可能在fc
之后添加3個填充字節,以便下一個對象在4的倍數的地址上開始)。
如您所見,struct( fa
)的第一個成員的地址將與整個struct對象的地址相同。 在第一個成員之前沒有填充或元數據。
要查看各種地址和大小,請使用以下命令:
printf( "address of f: %p\n", (void *) &f );
printf( "size of f: %zu\n", sizeof f );
printf( "address of f.a: %p\n", (void *) &f.a );
printf( "size of f.a: %zu\n", sizeof f.a );
printf( "address of f.b: %p\n", (void *) &f.b );
printf( "size of f.b: %zu\n", sizeof f.b );
printf( "address of f.c: %p\n", (void *) &f.c );
printf( "size of f.c: %zu\n", sizeof f.c );
就像我上面說的那樣,編譯器很可能在fc
之后添加填充字節,因此sizeof f
可能會大於sizeof f
sizeof fa + sizeof fb + sizeof fc
。
您正在使用的&
運算符是地址運算符 。 它將返回任何變量的地址,堆分配與否。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.