簡體   English   中英

C - struct變量是指針嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM