Что означает это предупреждение C? "формат int, указатель arg" - PullRequest
1 голос
/ 15 января 2010
#include <stdio.h>

int main() {
    // Declarations
    int iCount1, iCount2;
    int iXXTest[4][3] = {{2, 3, 5}, {9, 8, 6}, {1, 8, 4}, {5, 9, 7}};

    // Walk through 1st dimension
    for (iCount1 = 0; iCount1 < 4; iCount1++) {
        // Walk through 2nd dimension
        for (iCount2 = 0; iCount2 < 3; iCount2++) {
            printf("iXXTest[%d][%d] is at address %d and has a value of %d.\n", iCount1, iCount2, &iXXTest[iCount1][iCount2], iXXTest[iCount1][iCount2]);
        }
    }

    return 0;
}

Эта строка генерирует предупреждение:

printf("iXXTest[%d][%d] is at address %d and has a value of %d.\n", iCount1, iCount2, &iXXTest[iCount1][iCount2], iXXTest[iCount1][iCount2]);

int формат, указатель arg (arg 4)

О чем это предупреждение и как я могу его разрешить?

Ответы [ 3 ]

14 голосов
/ 15 января 2010

Это означает, что вы использовали формат% d (для целого числа), но аргумент фактически является указателем. Вместо этого используйте% p.

3 голосов
/ 15 января 2010

Спецификатор преобразования "% d" ожидает, что его соответствующий аргумент будет типа int, и вы передаете ему указатель на int. Используйте «% p» для распечатки значений указателя.

1 голос
/ 15 января 2010

Как сказали Джон и Джон, используйте %p для печати значений указателя. %p ожидает указатель на void (void *), поэтому вам нужно будет привести ваш указатель в вызове printf() к void *. Это потому, что, хотя в большинстве случаев компилятор выполняет неявное преобразование любого указателя объекта в void *, он не делает (не может) этого делать в функциях с переменным числом аргументов, поскольку он не знает, что функция в этих случаях требуется указатель void *.

printf("...at address %p...\n", (void *)&iXXTest[iCount1][iCount2]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...