format '% d' expects argument of type 'int', but argument 2 has type 'char *' - What is this? How to pack?

9

Code:

#include <stdio.h>

int main(void) {
        char caractere, *caractere_ptr = &caractere;

        printf("Caractere: foi alocado %zu byte\n", sizeof(caractere));
        printf("Endereço: %d", caractere_ptr);

        return 0;
}

Error being displayed:

warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
  printf("Endereço: %d", caractere_ptr);

What you would like to see is the memory address of the variable, not its value. For this reason, I did not initialize it.

    
asked by anonymous 23.01.2017 / 19:09

3 answers

5

To print the memory address, you must use %p . This way:

#include <stdio.h>

int main(void) {
    char caractere, *caractere_ptr = &caractere;
    printf("Caractere: foi alocado %zu byte\n", sizeof(caractere));
    printf("Endereço: %p", caractere_ptr);
}

See running on ideone . And No Coding Ground . Also put it on GitHub for future reference .

I will keep the original answer below for reference because it is still useful to some people, but it is not what the questioner wanted, and what was said is part of an assumption that is now wrong. >

But if you want to make it work correctly you should use %s .

There is a code table that can be used in a string formatting the printf() .

In this case you have a character pointer ( char * ) for a character, so it is a string you want to print, so the correct one is %s . If it were the character there would be %c . Luckily it will not print anything, but it can print a lot of unwanted stuff because when it prints a string it only for when it encounters a caractere null character, and it can get a lot of dirt until it finds a null. I speak of this in What's the difference between "NULL", "\ 0" and 0?

Note that what will print is a garbage, since the %code% variable was not initialized.

    
23.01.2017 / 19:16
5

%d is to show inteiros

If you want to show char , you should use %s

    
23.01.2017 / 19:12
4

The %d is for the printing of integers.

To print characters use %c

EDIT : As stated in the comment that the intent is to print the integer value of the memory address of *caractere_ptr .

As stated by the bigown answer, the correct one is to use %p

Here I leave some printing parameters that I removed from from here .

Código  Conversão/Formato do argumento
%d  Número decimal inteiro (int). Também pode ser usado %i como equivalente a %d.
%u  Número decimal natural (unsigned int), ou seja, sem sinal.
%o  Número inteiro representado na base octal. Exemplo: 41367 (corresponde ao decimal 17143).
%x  Número inteiro representado na base hexadecimal. Exemplo: 42f7 (corresponde ao decimal 17143). Se usarmos %X, as letras serão maiúsculas: 42F7.
%X  Hexadecimal com letras maiúsculas
%f  Número decimal de ponto flutuante. No caso da função printf, devido às conversões implícitas da linguagem C, serve tanto para float como para double. No caso da função scanf, %f serve para float e %lf serve para double.
%e  Número em notação científica, por exemplo 5.97e-12. Podemos usar %E para exibir o E maiúsculo (5.97E-12).
%E  Número em notação científica com o "e"maiúsculo
%g  Escolhe automaticamente o mais apropriado entre %f e %e. Novamente, podemos usar %G para escolher entre %f e %E.
%p  Ponteiro: exibe o endereço de memória do ponteiro em notação hexadecimal.
%c  Caractere: imprime o caractere que tem o código ASCII correspondente ao valor dado.
%s  Sequência de caracteres (string, em inglês).
%%  Imprime um %
    
23.01.2017 / 19:11