![](/img/trans.png)
[英]can I access a struct inside of a struct without using the dot operator?
[英]How can I test the -> C operator using a struct that allows me to access a struct's field?
我正在嘗試測試->
運算符,但似乎無法做到這一點,因為當我執行以下程序並向輸入流提供輸入時,該程序將停止工作。
注意1:我在編譯前收到警告,它說:
格式'%s'期望的參數類型為'char *',但是參數2的類型為'int'[-Wformat =]
注意2:如果我省略了printf("%s\\n", *(&home1)->name )
,它就可以正常工作,並且實際上可以打印我寫的任何內容。
#include <stdio.h>
#include <string.h>
typedef struct home_type {
char name[30] ;
}home;
int main (void) {
home home1 ;
char name[30] ;
scanf ("%[^\n]%*c", name);
strcpy( home1.name, name) ;
printf("%s\n", home1.name ) ;
printf("%s\n", *(&home1)->name ) ;
return 0 ;
}
刪除*
。 您的代碼*(&home1)->name
與*(home1.name)
類似,例如,它沒有將指針傳遞給第一個字符,而是傳遞了name
第一個char
的值; 由於默認的參數提升,該值將轉換為int
。
從而:
printf("%s\n", (&home1)->name );
應該管用; 但是,您不需要->
在這里; ->
現在只是更方便地使用指向結構的指針的快捷方式; 即(*ptr).name
成為更可口的ptr->name
; 由於home
已經是一個struct
,而不僅僅是指向該結構的指針,因此您應該使用.
代替。
您只需要刪除*
(即不取消引用):
printf("%s\n", (&home1)->name );
成員name
是一個數組,當傳遞給printf()
時,該數組將轉換為指針( char*
printf()
。 但是,當取消引用它時,它只是傳遞的一個char
。 顯然,它與printf()
對%s
格式的期望不匹配。
請參閱: 什么是陣列衰減?
運算符->
和.
可以互換:
obj.field
與(&obj)->field
ptr->field
與(*ptr).field
ptr->field
相同 請注意,您已經在(&home1)->name
的結果中添加了一個星號,這會產生一個char
。 由於printf
是變量參數函數,因此在調用過程中char
被提升為int
,從而解釋了警告。
當為需要指針的參數傳遞int
值時,會發生未定義的行為; 在您的情況下,程序崩潰。 刪除取消引用運算符*
將解決此問題。
(&home1)->name
是成員數組。 *(&home1)->name
是成員數組上的取消引用,由於數組衰減,該引用等效於(&home1)->name[0]
。 此類型為char
。 傳遞一個char
通過...
一個可變參數函數如printf
促進它int
( ...
使默認參數促銷活動適用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.