【问题标题】:How to assign a struct member array using a struct pointer?如何使用结构指针分配结构成员数组?
【发布时间】:2020-05-02 17:38:21
【问题描述】:

如何使用结构体指针赋值an array wrapped into a struct?

我知道这种语法:

size_t initArrayList[] = {1,1,1};
memcpy(pStruct->sizet, initArrayList, sizeof(pStruct->sizet));

是否可以使用类似的语法:

Stru = (struct myStruct) {.sizet = {1,1,1}};

使用指针?

我希望能详细说明 (struct myStruct) {.sizet = {1,1,1}} 的作用。

struct myStruct {
  size_t sizet[3];
} ;

void struInit(struct myStruct * pStruct) ;

int main()
{
struct myStruct Stru;

    struInit(&Stru);

          if (Stru.sizet[1]==1)
              printf("\nStru.sizet[1]==1");

    return 0;
}

void struInit(struct myStruct * pStruct ) {

// I know this syntax
//   size_t initArrayList[] = {1,1,1};
//   memcpy(pStruct->sizet, initArrayList, sizeof(pStruct->sizet));

}

【问题讨论】:

  • 您是在问两个注释行中的哪一个是正确的?应该使用memcpy。
  • 当 Stru 通过地址传递时,我正在寻找与 Stru = (struct myStruct) {.sizet = {1,1,1}}; 类似的语法。我知道第一个注释行有效。
  • 之前看过这个,不知道怎么评论。我不会在生产代码中使用它,但是 .是访问匿名结构或比您的第一个答案更不直观/可维护的东西。 stackoverflow.com/questions/14248044/…
  • @Bwebb 语法是带有指定初始值设定项的复合文字。它是 C99,所以一直存在。所以是的,只要它是一个结构成员,就可以分配一个数组。我发现阅读完毕

标签: c arrays struct variable-assignment assign


【解决方案1】:

使用临时数组调用 memcpy(就像在 struInit 函数中注释掉的一样)

memcpy(pStruct->sizet, initArrayList, sizeof(pStruct->sizet));

或使用复合文字分配给指向的结构(注意使用 * 取消引用运算符)

*pStruct = (struct myStruct){.sizet={1,1,1}};

甚至是传统的for-loop,逐个元素地复制,做你想做的事。

或者,如果您不能依赖指定的初始值设定项或复合字面量, 两者都是自 C99 以来才标准化的功能,您可以 使用不使用它们的等效 C89 方式:

struct myStruct tmp = {{1,1,1}};
*pStruct = tmp;

我希望能详细说明 (struct myStruct) {.sizet = {1,1,1}} 的作用。

C99 中描述指定初始化器的相关部分和 复合文字是 6.7.8 Initialization 和 6.5.2.5 Compound 字面量。

简短的回答是,如果在struInit 函数中使用它 构造一个类型为struct myStruct 的本地未命名对象, 将其成员 sizet 初始化为 {1,1,1},这又是语法 用于数组元素初始化,为其赋值1 元素 [0]、[1] 和 [2],按确切顺序。

【讨论】:

  • 理解复合字面语法 {.sizet={1,1,1}} 所需的信息是对指定初始化程序 {.sizet= 的解释。
  • 我添加了另一种方法,仅使用 C89。如果您想了解有关指定初始化程序和复合文字的更多信息,我建议您阅读答案中现在提到的标准部分,并就您想了解的特定语法怪癖提出一个单独的问题。
  • 为了完整起见,C99 复合文字可用于赋值,而 C89 仅用于初始化。 OP强调分配,如果你能强调这一点,那么我可以验证答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 2018-04-08
相关资源
最近更新 更多