用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你试图打印未初始化的数组元素,这两种情况都会导致。而且你不能假设每次都会生成相同的中间值。明白。另外,你能解释一下为什么我修改第一个代码时输出会改变吗@阿曼在这两种情况下,您都试图打印未初始化的数组元素,这会导致错误。此外,您不能假设每次打印时都会生成相同的中间值。