【问题标题】:initialize two dimensional array of pointer elements using memset使用 memset 初始化指针元素的二维数组
【发布时间】:2008-12-29 04:57:56
【问题描述】:

我有这些结构定义

typedef struct my_s {
   int x;
   int y;
} my_T;

typedef struct your_s {
    my_T * x;
} your_T;

your_T array[MAX_COL][MAX_ROW];

要将数组的指针初始化为NULL,我可以这样做吗:

memset (array, 0, sizeof(array))

这对我来说不合适。

【问题讨论】:

  • 不应该是“your_T array[MAX_ROW][MAX_COL];”因为 C++ 中的数组是行优先顺序的?

标签: c++ arrays memset


【解决方案1】:

最简单的是

your_T array[MAX_COL][MAX_ROW] = {{{0}}};

【讨论】:

  • +1,澄清一下,这是因为所有未显式初始化的成员都将设置为 0,即空指针。
  • hmn,尝试这个,编译器给出警告:在数组[0][0] 附近的初始化器周围缺少大括号,我的警告被视为错误。
  • 抱歉,忘记了第三套牙套。结构数组的数组。
【解决方案2】:
typedef struct my_s {
   int x;
   int y;
} my_T;

typedef struct your_s {
    my_T * x;
} your_T;

your_T array[MAX_COL][MAX_ROW];

您不能使用 memset 将 your_T 的指针初始化为空,因为没有指定空指针的位模式全部由空位组成。但是你可以像这样创建你的数组:

your_T array[MAX_COL][MAX_ROW] = {{}};

元素将被默认初始化,这意味着对于指针,该指针将包含一个空指针值。如果你的数组是全局的,你甚至不必关心。这将在默认情况下发生。

【讨论】:

  • 感谢您的信息。我知道当全局时,它默认为 NULL,但我想确保它是 NULL-ed,因为我在嵌入式空间中运行......
  • 那么您可以使用 {{}}。缩进是一个实现可以在指针中存储一个不同于 0x0 的值,当通过对该存储单元的后续读取取消引用时,可能会导致生成陷阱。因此,0x0 位模式不需要空指针中的内容。
  • +1。空括号初始化在 C 中是非法的,但正如我刚刚了解到的,在 C++ 中是合法的,这是一个常见/有用的构造吗?
  • 我相信空指针被定义为 0 (C++03,4.10): ' 空指针常量是整数类型的整数常量表达式 (5.19) 右值,它计算到零。'这当然不是说指针会为零,而是赋值为0会使指针为空
  • 是的,空指针常量是产生零(所有位为零)的每个整数常量表达式。例如 ('a'-'a') 或简单的 0。将其转换为指针将产生一个空指针值,这不再是所有位为零了。
猜你喜欢
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 2017-01-19
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多