C 在代码块内将数组初始化为值0

C 在代码块内将数组初始化为值0,c,default-value,array-initialization,C,Default Value,Array Initialization,下面是片段 main(){ // while(){ int b; scanf("%d",&b); int arr[b]; } } 现在,由于我不知道数组的确切界限,我必须使用scanf*将其作为变量*。创建的数组包含垃圾值。为此,我必须将每个元素初始化为0,因为这就是我想要的 有没有一种方法可以让它工作,而不必每次在循环中初始化 谢谢 编辑 我想我可以使用calloc来分配内存。是否会使用不同的内存?如果需要运行时大小的数组,那么正确的方法取决于数组的大小 如果b的

下面是片段

main(){
//
  while(){
  int b;
  scanf("%d",&b);
  int arr[b];
  }
}
现在,由于我不知道数组的确切界限,我必须使用scanf*将其作为变量*。创建的数组包含垃圾值。为此,我必须将每个元素初始化为0,因为这就是我想要的

有没有一种方法可以让它工作,而不必每次在循环中初始化

谢谢

编辑
我想我可以使用calloc来分配内存。是否会使用不同的内存?

如果需要运行时大小的数组,那么正确的方法取决于数组的大小

如果
b
的值可能很大,则将其声明为本地数组可能会导致堆栈溢出。在这种情况下,更好的办法是使用
calloc
动态分配数组
calloc
将正确归零初始化
int
数组

如果数组相对较小且可以在堆栈上安全分配,则只需将其声明为本地数组(这是您在原始代码中所做的),然后使用
memset(arr,0,sizeof arr)
将其设置为全零


当然,在这两种情况下,最终都可能会在库函数中实现一个隐藏的内存归零周期。一般情况下,不使用循环就无法将大内存区域设置为零。

如果需要运行时大小的数组,则正确的方法取决于数组的大小

如果
b
的值可能很大,则将其声明为本地数组可能会导致堆栈溢出。在这种情况下,更好的办法是使用
calloc
动态分配数组
calloc
将正确归零初始化
int
数组

如果数组相对较小且可以在堆栈上安全分配,则只需将其声明为本地数组(这是您在原始代码中所做的),然后使用
memset(arr,0,sizeof arr)
将其设置为全零


当然,在这两种情况下,最终都可能会在库函数中实现一个隐藏的内存归零周期。在一般情况下,不使用循环就无法将大内存区域设置为零。

如果编译器支持C99,则可以轻松使用VLA

int a, b; 
printf("Enter size of array: ");
scanf("%d",&b);

int arr[b];
在您的情况下,要将其所有元素初始化为零,请使用内部循环或标准库函数
memset

memset(b, 0, sizeof(b));

如果您的编译器支持C99,那么您可以轻松使用VLA

int a, b; 
printf("Enter size of array: ");
scanf("%d",&b);

int arr[b];
在您的情况下,要将其所有元素初始化为零,请使用内部循环或标准库函数
memset

memset(b, 0, sizeof(b));

当然,您可以使用
calloc()
。使用宏来表示大小如何?
memset(arr,0,sizeof(int)*b)
memset(arr,0,sizeof(arr))如何?@Kraken你可以这样做
scanf(“%d”,b);arr[b]。就好像您只想在运行时决定数组的大小一样。看,你得到了下面的答案:)当然你可以使用
calloc()
。那么使用宏来表示大小呢?
memset(arr,0,sizeof(int)*b)
memset(arr,0,sizeof(arr))怎么样?@Kraken你可以这样做
scanf(“%d”,b);arr[b]。就好像您只想在运行时决定数组的大小一样。看,你的答案如下:)@PHIfounder是的,但你的评论就在我的后面:)@AndreyT;我想不!Ooops我没看到,+1尽管如此,AndreyT的答案还是值得推荐的:)@Kraken,但这在你的代码中是不可见的,所以问题出在哪里。“不过,它应该会起作用的。”海怪;但是你已经写了,因为我不知道你问题中数组的确切界限……我很惊讶@是的,但你的评论就在我的后面:)@AndreyT;我想不!Ooops我没看到,+1尽管如此,AndreyT的答案还是值得推荐的:)@Kraken,但这在你的代码中是不可见的,所以问题出在哪里。“不过,它应该会起作用的。”海怪;但是你已经写了,因为我不知道你问题中数组的确切界限……我很惊讶!