【问题标题】:How to satisfy the warnings about incompatible types on printf()如何满足有关 printf() 上不兼容类型的警告
【发布时间】:2020-01-09 09:24:40
【问题描述】:

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

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

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

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

如果我将它转换为

,我可以摆脱这个警告
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));
}

【问题讨论】:

    标签: c types casting


    【解决方案1】:

    使用&amp;vowels,您将获得指向数组本身的指针,该指针的类型为char (*)[5],如错误消息中所述。您似乎想要的是指向数组中的 第一个元素 的指针,它是 &amp;vowels[0],或者是普通的 vowels,因为 decays 指向指向它的第一个元素的指针元素:

    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));
    

    【讨论】:

      【解决方案2】:
      char vowels[] = {'A', 'E', 'I', 'O', 'U'};
      char *pvowels = &vowels;
      

      这里vowels 是一个数组,如果你获取地址,你会得到一个数组的地址。 pvowels 是指向 char 的类型指针,而不是 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));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-29
        • 2015-10-10
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多