为了回答到底发生了什么,我想首先展示你的数组初始化的作用。您的数组初始值设定项列表不完整,由于大小大于列表而缺少元素。这将导致缺失元素的零初始化 https://stackoverflow.com/a/201116/8051589.
1. char cr[3]
array:
char cr[3] = { 'a', 'b' };
将导致:
character represantation == decimal representation
-+----+----+----+----+----+----+- -+----+----+----+----+----+----+-
| | a | b | \0 | | | | | 97 | 98 | 0 | | |
-+----+----+----+----+----+----+- -+----+----+----+----+----+----+-
^~~~ ^~~~
| char | char
cr cr
The printf()
函数定义为:int printf( const char* format, ... ); http://en.cppreference.com/w/cpp/io/c/fprintf。
这意味着需要一个char
指针,并且不会更改所指向的元素。
如果您现在通过了cr
数组到printf()
功能数组名称将衰减为指针 https://stackoverflow.com/questions/33291624/why-do-arrays-in-c-decay-to-pointers. The printf()
函数解释了format
参数为以 null 结尾的字符数组,称为 C 字符串 https://en.wikipedia.org/wiki/Null-terminated_string. Your cr
array 是一个以 null 结尾的 C 字符串,因为它由以下部分组成{ 'a', 'b', '\0' }
。这意味着printf()
函数可以成功打印字符串"ab"
到标准输出。
2. int ar[3]
array:
int ar[3] = { 1, 2 };
将导致:
-+----+----+----+----+----+----+-
| | 1 | 2 | 0 | | |
-+----+----+----+----+----+----+-
^~~~
| int
ar
目前,与第一种情况相比,您没有看到很大的差异(只是类型和内容)。但现在你正在通过ar
数组到printf()
功能。数组名称将衰减为int*
并隐式转换为const char*
(这将为您带来编译器警告你有)。如果printf()
函数现在取消引用内存,如下所示(假设int
由 4 个字节组成,您的机器使用小端存储表示 https://en.wikipedia.org/wiki/Endianness):
-+----+----+----+----+----+----+----+----+----+----+----+----+----+-
| | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-+----+----+----+----+----+----+----+----+----+----+----+----+----+-
^~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~
| int int int
^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~
| char char char char char char char char char char char char
ar
而不是得到像这样的字符串"12"
打印后,它将消耗两个左边的字符,即十进制值 1 和 0(空终止符),请参见上图。 1和0之后剩余的十进制值为not按空终止符后面的位置进行识别。假设您的机器使用ASCII 表 http://www.asciitable.com/小数 1 不是可打印字符,会导致打印垃圾值。
概念证明:
为了证明我写的内容,您可以使用以下函数,该函数的第一个参数与printf()
,即const char*
:
void printhexchars(const char* str)
{
while(*str)
{
printf("%03d ", *(str++));
}
/* print last character after while loop: '\0' */
printf("%03d ", *str);
}
此函数打印以 null 结尾的 C 字符串的整数表示形式。看你的数组的例子char cr[3] and int ar[3]在 ideone.com 上 https://ideone.com/qSnTo2。当然,将整数数组传递给上面的函数将生成与之前相同的编译器警告。
Output:
character array output using printf() : 097 098 000
Integer array output using printf() : 001 000
正如你所看到的,你得到了097 098 000
这是"ab"
为你的字符数组。
你的整数数组导致001 000
这会导致十进制值为 1 的不可打印字符。