【问题标题】:Assigning Arrays inside a Struct to a new Struct with Arrays将结构内的数组分配给带有数组的新结构
【发布时间】:2018-06-11 02:17:12
【问题描述】:

所以我有一个结构,里面有数组,如下所示:

struct struct1 {
unsigned char   data1[32];
unsigned char   data2[32];
char   *id;
};

第二个结构定义为

typedef struct
{
   uint8_t id;  
   uint8_t data1[32]; 
   uint8_t data2[32]; 
} struct2;

其中已经包含数据的 Struct1 通过如下函数传递给我:

bool func1(struct struct1 * const struct1)

我需要创建一个新的 struct2 并将 struct1 中的所有数据传递给它。

我以为我可以像这样分配指针

struct2 *new_struct;

new_struct->id = struct1->id;
new_struct->data1 = struct1->data1;
new_struct->data2 = struct1->data2;

但我猜 C 中的数组指针无法更改(或者至少这是我从阅读中得到的)。

那么我如何创建一个新的 struct2 并将我需要的数据从 struct1 传递给它呢?

【问题讨论】:

  • memcpy(struct1->data1, new_struct->data1, size_of(struct1->data))

标签: c arrays struct


【解决方案1】:

C 中的数组指针不能更改

没有“数组指针”这样的东西。要么你有一个数组,要么你有一个指针。

在您的情况下,data1data2 是数组,因此没有可以重新分配的指针。您唯一的选择是将存储在数组中的数据从一个结构复制到另一个结构。

您可以在相同类型的结构变量之间使用简单的赋值 (=),但在您的情况下,您有不同的类型,因此您需要分别复制每个成员。最简单的方法是使用memcpy(来自<string.h>)。

#include <string.h>

// ...
struct2 new_struct;

new_struct.id = *struct1->id;
memcpy(new_struct.data1, struct1->data1, sizeof new_struct.data1);
memcpy(new_struct.data2, struct1->data2, sizeof new_struct.data2);

注意事项:

  • new_struct 不是这里的指针。在您的示例中,您取消引用了一个未初始化的指针,该指针具有未定义的行为。
  • 我取消了struct1-&gt;id 的引用,因为struct2.id 是单个char,而不是指针。我想这就是你想要发生的事情。

【讨论】:

  • 嗯,有一个叫做数组指针的东西,但它不是这个例子。指向数组unsigned char data1[32]; 的数组指针被声明为unsigned char(*ptr)[32]。 OP不能在相同类型的struct变量之间使用简单赋值的原因是因为它们是数组,而C不允许数组赋值。
  • 狡辩,但我知道你的意思。 “array pointer”、“pointer to array”,我看到它们可以互换使用,但相信后者是正确的措辞。 (至少在我看来,它展开为“指向 char[32] 类型数组的指针”)
  • 据我了解,data1 本身就是指向存储第一个元素的内存的地址指针。所以你可以做类似 unsigned char *ptr = data1, and ptr[0]==data1[0] ?
  • @electronuts 你的结论是正确的(你可以做unsigned char *ptr = data1),但你的假设不是:data1 不是地址或指针;它是一个数组(如果您查看内存,数组它的元素;没有额外的结构)。您可以将其视为指针的原因是存在隐式转换:每当您在表达式中使用数组(并且它不是&amp;sizeof 的操作数)时,您都会获得指向其第一个元素的指针而是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多