用C语言打印字符数组

用C语言打印字符数组,c,arrays,char,C,Arrays,Char,如果我将上述代码更改为: @aO 4 实际上,在a后面的“a”和“@”之间有2个包含4个数字的立方体(立方体的每个象限中有1个数字),但由于某些原因,它们没有显示出来。如果我对您不理解,请在代码块中尝试上述代码 我希望第一个代码的输出是a4。为什么不是这样?另外,当我添加更多代码时,为什么输出会发生变化?我希望输出为: @a@ 4 @a@ 4 问题是您没有初始化数组。为了获得该输出,您可以通过以下方式进行: a 4 a 4 chars[10]; 对于(int i=0;i

如果我将上述代码更改为:

@aO   4
实际上,在a后面的“a”和“@”之间有2个包含4个数字的立方体(立方体的每个象限中有1个数字),但由于某些原因,它们没有显示出来。如果我对您不理解,请在代码块中尝试上述代码

我希望第一个代码的输出是
a4
。为什么不是这样?另外,当我添加更多代码时,为什么输出会发生变化?我希望输出为:

@a@ 4
@a@ 4

问题是您没有初始化数组。为了获得该输出,您可以通过以下方式进行:

a    4
a    4
chars[10];

对于(int i=0;i而言,问题在于您没有初始化数组。为了获得该输出,您可以通过以下方式进行初始化:

a    4
a    4
chars[10];
对于(inti=0;i此处

字符数组
s
未初始化&默认
s
元素包含垃圾数据,因为它具有自动存储持续时间,并且您仅将值分配给
s[1]
s[6]

因此,除了
s[1]
s[6]
之外的数组元素都包含垃圾数据&打印它们的值并不能保证每次都与您所显示的相同

为了避免这种情况,可以像这样初始化数组

char s[10]; /* uninitialized array */ 
在声明自己时。

此处

字符数组
s
未初始化&默认
s
元素包含垃圾数据,因为它具有自动存储持续时间,并且您仅将值分配给
s[1]
s[6]

因此,除了
s[1]
s[6]
之外的数组元素都包含垃圾数据&打印它们的值并不能保证每次都与您所显示的相同

为了避免这种情况,可以像这样初始化数组

char s[10]; /* uninitialized array */ 

在声明自身时。

您必须了解程序背后的行为。因此,当您加载程序时,它在内存中被赋予
N
字节,并且
N
字节被多次重复使用,而不会被擦除。因此,首先,您的程序将一些数据加载到
s[0]的位置
稍后将驻留在第二个位置,在第二个位置加载了一些东西,它们也位于
s[2]
的位置。这就是为什么在这两种情况下会得到不同的输出

总而言之:除非您自己执行,否则您的数组不会被初始化为
0
,而是被赋予了以前被同一程序使用过的内存。要按照之前的指示执行,您必须执行以下操作:

char s[10] = ""; /* initialize all array elements  with 0 */
我看到的另一件事是,在C/C++/Java数组中,在
a
之前,您不希望有空格,索引从
0
开始

char s[10] = "          ";
....
您可能会得到:

char s[4];

s[1] = 'a';
s[2] = 'b';
s[3] = '\0';

print ("%s", s);
出现
@
是因为
s[0]
所在的内存点中并没有您作为程序员编写的任何内容


请注意,每次在
C
中有字符串时,您都必须以“\0”字符终止它。

您必须了解程序背后的行为。因此,当您加载程序时,内存中会给出
N
字节,并且
N
字节会被多次重复使用,而不会被擦除。因此,首先,您的程序已加载一些数据进入
s[0]
稍后将驻留的位置,在第二种情况下,在
s[2]
的位置也加载了一些数据。这就是为什么在这两种情况下会得到不同的输出

总而言之:除非您自己执行,否则您的数组不会被初始化为
0
,而是被赋予了以前被同一程序使用过的内存。要按照之前的指示执行,您必须执行以下操作:

char s[10] = ""; /* initialize all array elements  with 0 */
我看到的另一件事是,在C/C++/Java数组中,在
a
之前,您不希望有空格,索引从
0
开始

char s[10] = "          ";
....
您可能会得到:

char s[4];

s[1] = 'a';
s[2] = 'b';
s[3] = '\0';

print ("%s", s);
出现
@
是因为
s[0]
所在的内存点中并没有您作为程序员编写的任何内容


请注意,每次在
C
中有字符串时,都必须使用“\0”字符终止该字符串。

由于数组的其他元素未初始化,因此您正在调用未定义的行为。@Osiris“如果没有显式初始化具有自动存储持续时间的对象,则其值不确定。”1.事实并非如此UB@Ctx是的,但我认为访问它是不可能的。@Osiris不,它不是,这就是我试图告诉你的you@Ctx在
J.2未定义行为
一节中的标准中,写入了
具有自动存储持续时间的对象的值,而该值是不确定的(6.2.4、6.7.9、6.8).
由于数组的其他元素未初始化,因此您正在调用未定义的行为。@Osiris“如果没有显式初始化具有自动存储持续时间的对象,则其值不确定。”1.事实并非如此UB@Ctx是的,但我认为访问它是不可能的。@Osiris不,它不是,这就是我试图告诉你的you@Ctx在
J.2未定义行为
一节中的标准中,写入了
具有自动存储持续时间的对象的值,而该值是不确定的(6.2.4、6.7.9、6.8).
明白。另外,你能解释一下为什么我修改第一个代码时输出会改变吗?@Aman你试图打印未初始化的数组元素,这两种情况都会导致。而且你不能假设每次都会生成相同的中间值。明白。另外,你能解释一下为什么我修改第一个代码时输出会改变吗@阿曼在这两种情况下,您都试图打印未初始化的数组元素,这会导致错误。此外,您不能假设每次打印时都会生成相同的中间值。