示例来源
#include <stdio.h>
int main( void ) {
char tab[2][3] = {'1', '2', '\0', '3', '4', '\0'};
printf("%s\n", tab);
return 0;
}
编译警告
$ gcc test.c
test.c: In function ‘main’:
test.c:5: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[3]’
指针就是指针
The %s
论证printf
向函数表明它将接收一个指针(指向一个字符串)。在 C 语言中,字符串仅仅是一系列以 ASCII-Z 结尾的字节。这tab[2][3]
变量是一个指针。有些编译器会发出有关指针不匹配的警告。但是,代码仍然应该打印出来12
因为printf
的代码从给定的指针开始遍历内存(打印字符),直到找到零字节。 1、2 和 \0 在内存中连续设置,从由 表示的地址开始tab
多变的。
实验
作为一个实验,当您编译并运行以下代码时会发生什么:
#include <stdio.h>
int main( void ) {
char tab[2][3] = {'1', '2', '\0', '3', '4', '\0'};
printf("%s\n", tab[1]);
return 0;
}
不要害怕尝试。看看你能否根据你现在所知道的得出答案。你会如何参考tab
现在(根据实验)摆脱警告并仍然显示12
?