【发布时间】:2019-06-28 02:19:08
【问题描述】:
问题:虽然我声明了两个char字符串,它们的内容相同,但输出不同。
#include <stdio.h>
int main(void)
{
/* Initialization of two different array that We deal with */
char arr1[10]={'0','1','2','3','4','5','6','7','8','9'};
char arr2[10]="0123456789";
/* Initialization End */
for(int i = 0 ; i < 11 ; ++i)
{
printf("arr1[%d] is %c \t\t",i,arr1[i]);
printf("arr2[%d] is %c\n",i,arr2[i]);
if(arr1[i]=='\0')
printf("%d . character is \\0 of arr1 \n",i);
if(arr2[i]=='\0')
printf("%d . character is \\0 of arr2 \n",i);
}
return 0;
}
期望:我期望两个 if 语句对于任何类型的 'i' 值都是正确的。
输出: 这是我得到的输出。
arr1[0] is 0 arr2[0] is 0
arr1[1] is 1 arr2[1] is 1
arr1[2] is 2 arr2[2] is 2
arr1[3] is 3 arr2[3] is 3
arr1[4] is 4 arr2[4] is 4
arr1[5] is 5 arr2[5] is 5
arr1[6] is 6 arr2[6] is 6
arr1[7] is 7 arr2[7] is 7
arr1[8] is 8 arr2[8] is 8
arr1[9] is 9 arr2[9] is 9
arr1[10] is 0 arr2[10] is
10 . character is \0 of arr2
【问题讨论】:
-
它们不一样。
"0123456789"自动包含空终止符,但您手动构造的字符串不包含。 -
array[10]是数组中的第 11 个元素。 -
@SeptemberSKY 内容不一样 :) 听@Blaze - 字符串文字有一个自动附加的 0 终止符。例如。
arr2在 idx 10 处的第 11 个元素是 0x00, 0, '\0'。您错误地声明arr2包含 10 个字符,但您的初始化字符串包含 11(包括隐式零终止符) -
在
arr1[10]中,您正在调用未定义的行为(读取超出数组大小)。可能您正在阅读的'0'是第二个数组arr2中的第一个元素,它很可能存储在arr1之后 -
@MortenJensen 是的,string literal 包含一个空终止符,但 array
char[10]没有空间来存储它。使示例等效。桑德是正确的。