在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 arr
或 20 * 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代码中将数组归零[重复]的主要内容,如果未能解决你的问题,请参考以下文章