#include<stdio.h>
void main()
{
char a[10][5] = {"hi", "hello", "fellow"};
printf("%s",a[0]);
}
为什么此代码仅打印 hi
#include<stdio.h>
void main()
{
char a[10][5] = {"hi", "hello", "fellow"};
printf("%s",a[1]);
}
此代码正在打印&#34; hellofellow &#34;
答案 0 :(得分:2)
您的代码:
char a[10][5] = {"hi", "hello", "fellow"};
分配10 char [5]
“你好”占用5,所以终止\0
没有空间,所以它会遇到“伙伴”
如果你尝试一下,a [3]
应为“w”,因为“伙伴”太大而“w”从a[2]
延伸到a[3]
除了未定义的行为之外,你想要做的事情令人困惑
答案 1 :(得分:2)
它会给取消定义行为,因为string
为null-terminated
。
元素hello
的长度为5
。
将您的数组声明为a[10][7]
,然后您将得到预期的输出。
请参阅此处 - https://ideone.com/c2zUs0
为什么此代码只打印
因为a[0][2]
null
表示已终止,因此会向您hi
发送。
答案 2 :(得分:2)
为什么此代码只打印
您告诉printf
打印存储在a[0]
的字符串,该字符串恰好是"hi"
。
虽然此代码正在打印“hellofellow”
这个巧合,实际上你的代码应该被编译器拒绝a constraint violation:
初始化程序不应尝试为未初始化的实体中包含的对象提供值。
字符串"fellow"
,特别是其末尾的'w'
不适合正在初始化的char[5]
,这违反了C标准。也许巧合的是,你的编译器提供了一个扩展(在技术上使它成为非C编译器),所以你没有看到我做的the error messages:
prog.c:3:6: error: return type of 'main' is not 'int' [-Werror=main]
void main()
^
prog.c: In function 'main':
prog.c:5:37: error: initializer-string for array of chars is too long [-Werror]
char a[10][5] = {"hi", "hello", "fellow"};
^
请注意,第二条错误消息是抱怨"fellow"
,而不是"hello"
。您的"hello"
初始化is valid by exception:
字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选择用大括号括起来。字符串文字的连续字节(包括终止空字符,如果有空间或数组大小未知)初始化数组的元素。
重点是我的。强调部分指出,如果没有足够的空间容纳终端'\0'
字符,则不会在初始化中使用。
答案 3 :(得分:1)
由于存储\0
个字符的空间不足,这是未定义的行为。
请注意,在字符串数组中,每个字符串分配的内存为5
个字节。因此,对于a[1]
,没有足够的内存来存储\0
字符,因为所有五个字节都分配有"hello"
。
因此,读取后续内存直到找到
\0
字符。
因此,您可以更改以下行:
char a[10][5] = {"hi", "hello", "fellow"};
到
char a[][7] = {"hi", "hello", "fellow"};
为什么此代码仅打印 hi
这是因为在\0
已遇到a[0][2]
字符,因此字符的读取已停止。
答案 4 :(得分:1)
您的代码的作用:
请看以下声明:
public int compareTo(Person per) {
int i= firstName.compareTo(per.firstName);
if(0!= i) return i;
else
return lastName.compareTo(per.lastName);
}
它分配char a[10][5] = {"hi", "hello", "fellow"};
行。为10
的每个索引分配5
个字符。
问题是什么:
字符串Null Terminated除了给定的字符外,总是需要存储a
,因此基本上使用的数组大小为null-terminator
,额外的一个字节用于null终止符。在使用numOfCharacters+1
个字符数初始化数组时,将跳过size
。通常打印字符数组值,直到找不到第一个null terminator
(空终止符)。另请查看this。
解决方案:
无需担心此问题,您只需将大小设置为\0
即可。您可以使用以下语句:
numOfCharactersInString + 1
由于最大字符串char a[10][7] = {"hi", "hello", "fellow"};
包含"fellow"
个字符,因此您需要设置大小6
,这就是语句应使用6 + 1
而不是char {{}的原因。 1}}
希望它有所帮助。
答案 5 :(得分:1)
当您将二维字符数组声明为
时char a[10][5] = {"hi", "hello", "fellow"};
char a [10] [5]保留存储器以存储10个长度为5的字符串,这意味着4个字符+ 1&#39; \ 0&#39;字符。需要注意的是,数组元素存储在连续的内存位置。
a [0]指向第一个字符串,a [1]指向第二个字符串,依此类推。
此外,当您初始化数组时,其他未初始化的元素将变为0而不是垃圾值。
现在在您的情况下,在初始化后如果您尝试可视化数组,它将类似于
喜\ 0 \ 0 \ 0hellofello \ 0 \ 0 ...
现在命令
printf("%s",a[0]);
打印从&#39; h&#39;开始的字符。 &#34; hi&#34;并且当&#39; \ 0&#39;停止打印遇到了这样的事情&#34;嗨&#34;打印出来。
现在是第二种情况,
printf("%s",a[1]);
字符从&#39; h&#39;开始打印。 &#34;你好&#34;直到&#39; \ 0&#39;遇到了。现在&#39; \ 0&#39;只有在打印之后才会遇到字符&#34; hellofello&#34;因此输出。