簡體   English   中英

如何滿足 printf() 上關於不兼容類型的警告

[英]How to satisfy the warnings about incompatible types on printf()

我正在學習 learn-c.org 上的教程。 來到關於Arrays 和 Pointers的部分,如果我在我的系統上運行示例程序的前兩行會發出警告:

char vowels[] = {'A', 'E', 'I', 'O', 'U'};
char *pvowels = &vowels;

代碼運行,但我收到以下警告:

警告:從不兼容的指針類型 'char (*)[5]' 初始化 'char *' [-Wincompatible-pointer-types] 15 | char *pvowels = &vowels;

如果我將其轉換為,我可以擺脫這個警告

char *pvowels = (char *) &vowels;

但這是處理該警告的正確方法嗎? 首先似乎沒有必要,我真的不明白char *char (*)之間的區別。


接下來, printf行對第三個參數發出警告,說:

警告:格式 '%u' 需要類型為 'unsigned int' 的參數,但參數 3 的類型為 'char *' [-Wformat=]

(參數 5 和 7 相同)

這個我什至不知道如何投射以繞過警告......打印這個的正確方法是什么?


他們教程中的整個程序供參考:

char vowels[] = {'A', 'E', 'I', 'O', 'U'};
char *pvowels = &vowels;
int i;

// Print the addresses
for (i = 0; i < 5; i++) {
    printf("&vowels[%d]: %u, pvowels + %d: %u, vowels + %d: %u\n", i, &vowels[i], i, pvowels + i, i, vowels + i);
}

// Print the values
for (i = 0; i < 5; i++) {
    printf("vowels[%d]: %c, *(pvowels + %d): %c, *(vowels + %d): %c\n", i, vowels[i], i, *(pvowels + i), i, *(vowels + i));
}

使用&vowels你會得到一個指向數組本身的指針,它是錯誤消息中提到的char (*)[5]類型。 您似乎想要的是指向數組中第一個元素的指針,該元素將是&vowels[0]或純vowels因為它會衰減到指向其第一個元素的指針:

char *pvowels = vowels;

此外,當您想用printf打印指針時,您需要使用%p格式。 它打印void *類型的“通用”指針,因此要完全正確,您需要將所有指針強制轉換為void *

printf("&vowels[%d]: %p, pvowels + %d: %p, vowels + %d: %p\n", i, (void *) &vowels[i], i, (void *) (pvowels + i), i, (void *) (vowels + i));
char vowels[] = {'A', 'E', 'I', 'O', 'U'};
char *pvowels = &vowels;

這里vowels是一個數組,如果你取地址,你就會得到一個數組的地址。 pvowels是指向char pointer to array類型,而不是pointer to array

如果要獲取第一個字符的地址,只需使用數組的名稱。 它會衰減到指向第一個元素的指針,這正是您需要的:

char *pvowels = vowels;

您的第二條消息是因為您使用了錯誤的類型:

// Print the addresses
for (i = 0; i < 5; i++) {
    printf("&vowels[%d]: %u, pvowels + %d: %u, vowels + %d: %u\n", i, &vowels[i], i, pvowels + i, i, vowels + i);
}

你想打印一個地址。 該消息非常清楚%u用於打印整數,而不是地址。 改用%p並提供void*類型的參數:

類型:

// Print the addresses
for (i = 0; i < 5; i++) {
    printf("&vowels[%d]: %p, pvowels + %d: %p, vowels + %d: %p\n", i, (void*)&vowels[i], i, (void*)(pvowels + i), i, (void*)(vowels + i));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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