【问题标题】:Clearing a C array to zero when passed as a member of a pointer to a struct当作为指向结构的指针的成员传递时,将 C 数组清除为零
【发布时间】:2015-11-19 15:47:05
【问题描述】:

当我有一个结构定义时在 C++ 中

struct foo
{
    ...
};

struct bar
{
    foo FooData[10];
    ...
};

我想写一个函数

void Baz(bar *Bar)
{
    Bar->FooData = {};
}

我收到一个错误(Visual Studio Community 2013 中的 C3079)“初始化列表不能用作此赋值运算符的右操作数。”

然而,这种语法在类似的情况下似乎可以正常工作

int Array[10];
Array = {};
...

为什么前面的例子编译失败?

【问题讨论】:

  • 数组不可赋值。另外,请只标记一种语言。
  • 我会添加你的最后一个示例不应该编译,并且不使用 clang 3.5 编译;责怪视觉工作室不够严格。
  • @paulsm4 或*bar = Bar{}。取决于语言。
  • 鉴于它被标记为c++,我更喜欢std::fill 而不是memset

标签: c++ arrays initializer


【解决方案1】:

关于您的问题:您可以在定义数组时使用“{}”......但之后不能。

关于这个问题,我推荐memset

memset(Bar->FooData, 0, sizeof (bar->FooData));

如果你想动态分配 FooData,你可以像这样定义你的结构:

struct bar
{
    foo *FooData;
    ...

【讨论】:

  • sizeof Bar->Foodata
  • 如果foo 的布局不简单,那将会以泪水告终。
  • #define CLEAR(T) memset(&(T),0, sizeof(T))
  • 换句话说,如果“foot”本身包含指针,所有的赌注都会被取消。真的。但是,如果数据是连续的,memset 仍然是第一个也是最好的工具。
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
相关资源
最近更新 更多