簡體   English   中英

如何使用允許我訪問結構域的結構測試-> C運算符?

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

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