#include<stdio.h>
void main()
{
char a[10][5] = {"hi", "hello", "fellow"};
printf("%s",a[0]);
}
为什么这个代码打印只喜
#include<stdio.h>
void main()
{
char a[10][5] = {"hi", "hello", "fellow"};
printf("%s",a[1]);
}
虽然这段代码正在打印“hellofellow”
为什么这个代码打印只喜
你已经告诉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'
字符,那将不会用于初始化。
你的代码:
char a[10][5] = {"hi", "hello", "fellow"};
分配10个char [5]
“你好”占用5,所以没有空间终止\0
,所以它遇到“伙伴”
如果你试试,a [3]
应该是“w”因为“伙伴”太大而“w”从a[2]
到a[3]
除了未定义的行为之外,您正在尝试做的事情令人困惑
它将给出不确定的行为,因为qazxsw poi是qazxsw poi。
元素string
的长度为null-terminated
。将您的数组声明为hello
然后您将得到预期的输出。
看这里-5
为什么这个代码打印只喜
因为a[10][7]
是https://ideone.com/c2zUs0,表示终止因此给你a[0][2]
。
这是未定义的行为,因为没有足够的空间来存储null
字符。
请注意,在字符串数组中,为每个字符串分配的内存为hi
bytes。因此,对于\0
,没有足够的内存来存储5
字符,因为所有五个字节都分配有a[1]
。
因此,读取后续存储器直到找到
\0
字符。
因此,您可以更改该行:
"hello"
至
\0
为什么这个代码打印只喜
这是因为在char a[10][5] = {"hi", "hello", "fellow"};
已经遇到char a[][7] = {"hi", "hello", "fellow"};
字符,因此停止了字符的读取。
您的代码的作用:
请看以下声明:
\0
它分配a[0][2]
行。 char a[10][5] = {"hi", "hello", "fellow"};
字符分配给10
的每个索引。
问题是什么:
字符串是5
除了给定的字符之外总是需要存储a
,所以基本上使用的数组大小是Null Terminated,额外的一个字节用于空终止符。当您使用null-terminator
字符数初始化数组时,将跳过numOfCharacters+1
。通常打印字符数组值,直到找不到第一个size
(空终止符)。还请看看null terminator
。
解决方案:
无需担心此问题,您只需将大小设置为等于\0
即可。您可以使用以下语句:
this
由于最大的字符串是包含numOfCharactersInString + 1
字符的char a[10][7] = {"hi", "hello", "fellow"};
,你需要设置大小"fellow"
,这就是为什么语句应该使用6
而不是char 6 + 1
希望能帮助到你。
声明二维字符数组时
char a[10][7]
char a [10] [5]保留存储器以存储10个长度为5的字符串,这意味着4个字符+ 1个\ 0'字符。需要注意的是,数组元素存储在连续的内存位置。
a [0]指向第一个字符串,a [1]指向第二个字符串,依此类推。
此外,当您初始化一个数组时,其他未初始化的元素将变为0而不是垃圾值。
现在在你的情况下,在初始化之后,如果你试图可视化数组,那就像是
喜\ 0 \ 0 \ 0hellofello \ 0 \ 0 ...
现在命令
a[10][5]
打印从“hi”的'h'开始的字符,并在遇到'\ 0'时停止打印,因此打印“hi”。
现在针对第二种情况,
char a[10][5] = {"hi", "hello", "fellow"};
字符从“hello”的'h'开始打印,直到遇到'\ 0'。现在只有在打印“hellofello”后才会遇到'\ 0'字符,因此输出。