We have the following code fragment:
char tab[2][3] = {'1', '2', '\0', '3', '4', '\0'};
printf("%s\n", tab);
And I don't understand why we don't get an error / warning in the call to I DO get a warning but not an error, and the program runs fine. It prints 'printf
.12
'.printf
is expecting an argument of type char *
, i.e. a pointer to char
. So if I declared char arr[3]
, then arr
is an address of a memory unit which contains a char
, so if I called printf
with it, it would decay to pointer to char, i.e. char *
.
Analogously, tab
is an address of a memory unit that contains the type array of 3 char's which is in turn, an address of memory unit contains char
, so tab
will decay to char **
, and it should be a problem, since printf
is expecting a char *
.
Can someone explain this issue?
The warning I get is:a.c:6: warning: char format, different type arg (arg 2)
Example Source
#include <stdio.h>
int main( void ) {
char tab[2][3] = {'1', '2', '\0', '3', '4', '\0'};
printf("%s\n", tab);
return 0;
}
Compile Warning
$ gcc test.c test.c: In function ‘main’: test.c:5: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[3]’
Pointers are Pointers
The %s
argument to printf
indicates to the function that it will be receiving a pointer (to a string). A string, in C, is merely a series of bytes terminated by an ASCII-Z. The tab[2][3]
variable is a pointer. Some compilers will issue a warning about the pointer mismatch. However, the code should still print out 12
because printf
's code traverses memory starting at the pointer it was given (printing characters as it goes) until it finds a zero byte. The 1, 2, and \0 are contiguously set in memory, starting at the address represented by the tab
variable.
Experiment
As an experiment, what happens when you compile and run the following code:
#include <stdio.h>
int main( void ) {
char tab[2][3] = {'1', '2', '\0', '3', '4', '\0'};
printf("%s\n", tab[1]);
return 0;
}
Don't be afraid of experimenting. See if you can come up with the answer based on what you now know. How would you reference tab
now (in light of the experiment) to get rid of the warning and still display 12
?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With