首页 > 解决方案 > 如何满足有关 printf() 上不兼容类型的警告

问题描述

我正在学习 learn-c.org 上的教程。来到关于Arrays 和 Pointers的部分,如果我在我的系统上运行示例程序的前两行,它们会发出警告:

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

代码运行,但我收到以下警告:

警告:从不兼容的指针类型“char (*)[5]”初始化“char *”[-Wincompatible-pointer-types] 15 | 字符 *pvowels = &元音;

如果我将它转换为,我可以摆脱这个警告

char *pvowels = (char *) &vowels;

但这是否是处理该警告的正确方法,只是投掷它?首先这似乎没有必要,我真的不明白char *and之间的区别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));
}

标签: ctypescasting

解决方案


随着&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));

推荐阅读