在C代码中将数组归零[重复]

Posted

技术标签:

【中文标题】在C代码中将数组归零[重复]【英文标题】:Zero an array in C code [duplicate] 【发布时间】:2011-08-03 21:52:45 【问题描述】:

可能的重复:How to initialize an array to something in C without a loop?How to initialize an array in C

如何在不使用 for 或任何其他循环的情况下将已知大小的数组归零?

例如:

arr[20] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

这是很长的路...我需要它的捷径。

【问题讨论】:

还有***.com/questions/201101/… 你的“例子”并没有像你想象的那样做。 您发布的代码无效 C。尝试发布可编译的内容。 【参考方案1】:
int arr[20];
memset(arr, 0, sizeof arr);

见reference for memset

【讨论】:

这可能是错误的。您应该写 sizeof arr20 * sizeof (int) 一开始我很困惑,但后来我想起来了:“如果使用类型名称,则必须始终将其括在括号中,而表达式可以带括号或不带括号”(en.wikipedia.org/wiki/Sizeof) @BarafuAlbino sizeof(arr) 怎么会出错? 也可以用于非零值吗?我试过了,好像不是这样。【参考方案2】:

人bzero

NAME
   bzero - write zero-valued bytes

SYNOPSIS
   #include <strings.h>

   void bzero(void *s, size_t n);

DESCRIPTION
   The  bzero()  function sets the first n bytes of the byte area starting
   at s to zero (bytes containing '\0').

【讨论】:

-1 来自手册页的更多文本: ...此功能已弃用(在 POSIX.1-2001 中标记为 LEGACY):使用 memset(3) in新程序。 ... C 语言中没有名为strings.h 的头文件。这是一个(不必要/毫无意义的)非标准编译器扩展。【参考方案3】:
int arr[20] = 0;

C99[$6.7.8/21]

如果大括号括起来的列表中的初始值设定项少于元素或成员的数量 用于初始化已知数组的字符串文字中的聚合或更少字符 大小超过数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同


【讨论】:

这是否也适用于重置而不是初始化数组? 为什么不只是int arr[20] = ; 没有0 @StefanPochmann 因为它是 C,而不是 C++。 @PrasoonSaurav 不错,但我猜它不适用于动态数组 我认为这并不清楚它不会复制括号中的元素。所以float control[16] = 15.0;不是一个数组,15.0被复制了16次,而是一个15.0,其余为0。【参考方案4】:

使用memset:

int something[20];
memset(something, 0, 20 * sizeof(int));

【讨论】:

更好的是:int something[20]; memset(something, 0, sizeof something);【参考方案5】:

int arr[20] = 0 如果只需要执行一次,那将是最简单的。

【讨论】:

【参考方案6】:

注意:您可以将 memset 与任何字符一起使用。

例子:

int arr[20];
memset(arr, 'A', sizeof(arr));

也可以部分填充

int arr[20];
memset(&arr[5], 0, 10);

但要小心。它不受数组大小的限制,您可以很容易地对您的程序造成严重损坏,如下所示:

int arr[20];
memset(arr, 0, 200);

它会在你的数组之后工作(在 Windows 下)和零内存。可能会损坏其他变量值。

【讨论】:

这是 UB(未定义行为)的完美示例。编译器遇到这种情况时可以为所欲为,这通常意味着破坏。

以上是关于在C代码中将数组归零[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中将二维数组归零的最快方法是啥?

如何在c ++中将int数组转换为字节数组[重复]

在 C 代码中将 char 数组元素转换为等效的十六进制

在c#/LINQ中将数组转换为字符串的最短方法[重复]

在c中将字符串转换为int [重复]

如何在java中将密钥归零?