【问题标题】:Zero an array in C code [duplicate]在C代码中将数组归零[重复]
【发布时间】: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;

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

【问题讨论】:

标签: c arrays


【解决方案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(未定义行为)的完美示例。编译器遇到这种情况时可以为所欲为,这通常意味着破坏。
    猜你喜欢
    • 2015-09-16
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多