是否必须将默认值零分配给 C 中的整数数组?
Is it mandatory to assign default value zero to integer array in C?
我正在实施程序来计算字母数字字符串中数字的频率,但在花费数小时处理奇怪的输出后,我能够找到 C 将垃圾值设置为所有索引值的解决方案。但令我惊讶的是,编译器将一些值设置为零(在我的示例中,它为 0 to 7
索引设置 0
,并在 8th
和 9th
位置设置一些随机垃圾值).尽管如此,经过这么多次搜索并与同事讨论后,我还是找不到任何解决方案。
我在这里发布我的代码和输出。
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 1000
int main()
{
int ar[10];
char s[MAX_LENGTH];
scanf("%s",s);
for(int i = 0; i < strlen(s); i++){
int index = s[i] - 48;
if(index >= 0 && index <= 9){
ar[index] = ar[index] + 1;
}
}
for(int i = 0; i <= 9; i++){
printf("%d \n", ar[i]);
}
}
输入: as12556fsd889ad9
从调试器我得到了这张快照:
debugger snap shot
输出:
0
1
1
0
0
2
1
0
1606415986
32769
为什么编译器从索引 0 to 7
和索引 8
的 1606415986
和索引 9
的 32769
设置垃圾值 0
。
任何帮助或 link 让我对此有深刻理解的人将不胜感激。
我是初学者和学生,所以请不要对我的问题投反对票。
谢谢
虽然在 C 语言中初始化数组不是强制性的,但根本不应该使用未初始化的值。你代码中的数组 ar
是自动存储的,所以是未初始化的。由于您的代码依赖于初始值为零的事实,因此您必须使用 int ar[10] = { 0 };
显式初始化它
请注意,如果此数组被定义为全局变量,它将被初始化为 0
,但如果您使用 malloc()
分配它,它将未被初始化。始终初始化变量不会有什么坏处。
另请注意,您应该测试 scanf()
的 return 值并传递要存储到目标数组中的最大字符数:
if (scanf("%999s", s) != 1) {
printf("input error\n");
return 1;
}
函数内部的 int ar[10];
不会将元素初始化为 0。ar
是 未初始化.
ar[]
的元素值不确定。 @haccks
编译器可以将它们设置为0,可以将它们设置为"garbage",如果访问则停止代码并且它包含陷阱值,或许多其他可能性。最可能的情况是这些值是内存中的任何值。
重点是好的代码应该在读取它们之前首先初始化或分配它们。
// char s[MAX_LENGTH];
char s[MAX_LENGTH] = { 0 };
如果您希望它们具有可预测的初始值,那么可以。
int ary[10] = {0};
将它们全部初始化为零
我正在实施程序来计算字母数字字符串中数字的频率,但在花费数小时处理奇怪的输出后,我能够找到 C 将垃圾值设置为所有索引值的解决方案。但令我惊讶的是,编译器将一些值设置为零(在我的示例中,它为 0 to 7
索引设置 0
,并在 8th
和 9th
位置设置一些随机垃圾值).尽管如此,经过这么多次搜索并与同事讨论后,我还是找不到任何解决方案。
我在这里发布我的代码和输出。
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 1000
int main()
{
int ar[10];
char s[MAX_LENGTH];
scanf("%s",s);
for(int i = 0; i < strlen(s); i++){
int index = s[i] - 48;
if(index >= 0 && index <= 9){
ar[index] = ar[index] + 1;
}
}
for(int i = 0; i <= 9; i++){
printf("%d \n", ar[i]);
}
}
输入: as12556fsd889ad9
从调试器我得到了这张快照: debugger snap shot
输出:
0
1
1
0
0
2
1
0
1606415986
32769
为什么编译器从索引 0 to 7
和索引 8
的 1606415986
和索引 9
的 32769
设置垃圾值 0
。
任何帮助或 link 让我对此有深刻理解的人将不胜感激。
我是初学者和学生,所以请不要对我的问题投反对票。 谢谢
虽然在 C 语言中初始化数组不是强制性的,但根本不应该使用未初始化的值。你代码中的数组 ar
是自动存储的,所以是未初始化的。由于您的代码依赖于初始值为零的事实,因此您必须使用 int ar[10] = { 0 };
请注意,如果此数组被定义为全局变量,它将被初始化为 0
,但如果您使用 malloc()
分配它,它将未被初始化。始终初始化变量不会有什么坏处。
另请注意,您应该测试 scanf()
的 return 值并传递要存储到目标数组中的最大字符数:
if (scanf("%999s", s) != 1) {
printf("input error\n");
return 1;
}
int ar[10];
不会将元素初始化为 0。ar
是 未初始化.
ar[]
的元素值不确定。 @haccks
编译器可以将它们设置为0,可以将它们设置为"garbage",如果访问则停止代码并且它包含陷阱值,或许多其他可能性。最可能的情况是这些值是内存中的任何值。
重点是好的代码应该在读取它们之前首先初始化或分配它们。
// char s[MAX_LENGTH];
char s[MAX_LENGTH] = { 0 };
如果您希望它们具有可预测的初始值,那么可以。
int ary[10] = {0};
将它们全部初始化为零