【问题标题】:How to clear all the elements of array in C?如何清除C中数组的所有元素?
【发布时间】:2015-11-30 14:53:07
【问题描述】:
volatile static uint8_t buffer[16];
void ResetBuffer(){     
   for(int i=strlen((char*)buffer);i>=0;i--) buffer[i]='\0'; 
}

缓冲区变量必须始终在微控制器中使用,所以我使用了 volatile static 它是全局变量。 但是,为了使所有缓冲区清晰,这样编码是否正确?如果有错误或者有其他简单的代码,请给我一些简单的代码。

我听说如果我想清楚,那么将第一个元素设为空会更容易。像这样:缓冲区[0] = '\0'; 但是,当我这样编码时,仍然保留了其他元素。

我知道这是一个非常简单的问题。 但我很困惑。我一直在用 C++ 或 Java 编程,所以用 C 编程让我很困惑。

【问题讨论】:

  • strlen 如果你的缓冲区不是空终止的,可能会导致崩溃。
  • 我错过了,谢谢!

标签: c arrays string


【解决方案1】:
memset(buffer, 0, sizeof(buffer));

【讨论】:

  • @FrerichRaabe 除了sizeof(buffer) 已经是缓冲区的大小(以字节为单位)。乘以sizeof(*buffer)错误
【解决方案2】:

将 '\0' 分配给字符数组的第一个元素足以使其成为空字符串,但不会清除整个数组。

为了清除你需要使用

memset(buffer, 0, sizeof(buffer));

bzero(buffer, sizeof(buffer));

【讨论】:

  • 请注意bzero 不是标准的。来自bzero 手册:4.3BSD. This function is deprecated (marked as LEGACY in POSIX.1-2001): use memset(3) in new programs. POSIX.1-2008 removes the specification of bzero().
  • @sreeyesh 但是,为什么不编写这样的代码:memset(buffer,'\0',sizeof(buffer));因为我知道 '\0' 和 0 之间是不同的。
  • @Sean Charecter '\0' 的 ascii 值为 0。因此无论您使用 0 还是 '\0',编译器在这两种情况下都将始终传递值 0。但是 memset 的第二个参数是一个整数。由于 '\0' 是一个字符常量,因此编译器将完成类型转换。但是它由编译器处理。
【解决方案3】:

您对strlen() 的使用是错误的,这取决于缓冲区的内容是有效字符串;它不会清除整个缓冲区。

只需将memset()sizeof 一起使用:

memset(buffer, 0, sizeof buffer);

请注意,sizeof 不是函数,因此对于此类情况不需要(或在我看来不应该使用)括号。

如果您的 C 库不包含 memset(),当然可以使用普通循环:

for(size_t i = 0; i < sizeof buffer; ++i)
  buffer[i] = 0;

如果您只想清除所使用的部分,并且知道它是一个有效的字符串,那么您的代码当然可以工作。我可能不会使用反向循环,因为我觉得这不直观,但这就是我。

注意:如果此缓冲区用于字符串,则应将其类型更改为char,而不是uint8_t

【讨论】:

  • 终于有人意识到sizeof 不是一个函数……+1!
  • @TheParamagneticCroissant 我已经知道很长一段时间了,但当然还是很有趣。谢谢。
  • 是的,清除整个事情。将每个元素设置为 0 就可以做到这一点,并且清除它所需的几个额外时钟滴答声很容易少于算法只清除有限的几个所需的时间。
  • @unwind:我认为将uint8_t* 传递给strlen 即使使用演员表也是违反约束的(不确定,但我认为是这样)。
  • @Giorgi 好点,我编辑提到了类型更改建议。
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多