C语言编程中的二维字符数组

C语言编程中的二维字符数组,c,arrays,char,2d,C,Arrays,Char,2d,我在下面发现了一些奇怪的东西。我是新来的,不知道这有什么用 #include<stdio.h> int main(){ char y[]={"NO Error"};//This supposed to be 2D array ?! No Error! Did not write y[][]! char x[][10]={"No Error0","No Error1","No Error2"};//This also is a 2D array! and just fine.

我在下面发现了一些奇怪的东西。我是新来的,不知道这有什么用

#include<stdio.h>
int main(){

 char y[]={"NO Error"};//This supposed to be 2D array ?! No Error! Did not write y[][]!
 char x[][10]={"No Error0","No Error1","No Error2"};//This also is a 2D array! and just fine.
 char z[]={"Compile time Error","Compile time Error"};//Compile time Error! not like y[]!
 printf("%s ",x[2]);            //Output is "No Error2"! and fine.
 printf("%s ",x[2][4]);         //Runtime Error!I thought output will be "E".
 printf("\n%s ",y);             //Output is "NO Error" ! , No Problems .
 printf("\n%s ",y[0]);          //Runtime Error!
 return 0;
}
#包括
int main(){
char y[]={“无错误”};//这应该是2D数组?!无错误!没有写入y[]]!
char x[][10]={“No Error0”、“No Error1”、“No Error2”};//这也是一个2D数组!很好。
char z[]={“编译时错误”,“编译时错误”};//编译时错误!与y[]不同!
printf(“%s”,x[2]);//输出为“无错误2”!正常。
printf(“%s”,x[2][4]);//运行时错误!我以为输出将是“E”。
printf(“\n%s”,y);//输出为“无错误”!没有问题。
printf(“\n%s”,y[0]);//运行时错误!
返回0;
}

字符串用作字符数组。因此,在y[]中,一个字符串将适合。在x[][10]中,可以容纳一个字符串数组。但是在z[]中,字符串数组将不适合

此外,在printf中,%s是字符串(实际上是字符*)。在第二次printf中,您使用的是char。

在代码分析中

字符y[]={“无错误”}

不是二维数组,而是简单的一维字符数组。 下一个

char z[]={“编译时错误”,“编译时错误”}

将字符串数组(二维字符数组)初始化为字符数组。 这应该是

 char z[][100]={"Compile time Error","Compile time Error"};
你的代码

printf(“\n%s”,y[0])

是错误的,因为y不是2D数组作为
y[0]
仅点字符,您可以编写

printf("\n%c ",y);  //Output N

x[2][4]
char
而不是字符串。因此,在
printf
中使用
%s
将调用未定义的行为。使用%s的printf将查找字符串。除此之外,我相信你正在用那里的数据来推动你的运气。从技术上讲,y[]是指向字符数组的指针,但它不跟踪您如何使用该数据。幸运的是,您正在将字符值放入“数组”,它仍然会找到printf要打印字符串的正确空终止符。如果要打印特定字符,则需要使用%c,但这将尝试访问未初始化的内存…其他错误如何?第一个错误没有出现,因为您始终可以在初始值设定项中使用大括号:
int i={1}。但是,尝试添加第二个字符串文字(参见示例3),编译器会抱怨(如果没有,立即烧掉编译器,将灰烬撒在存储的硬盘上并撒上盐)!谢谢大家,我得到了答案。