如何从数组更改结构指针中数组的值?

时间:2018-10-30 16:34:33

标签: c arrays pointers

我有一个can_frame类型的结构数组,在can.h中定义如下:

struct can_frame {
    canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
    __u8    can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
    __u8    __pad;   /* padding */
    __u8    __res0;  /* reserved / padding */
    __u8    __res1;  /* reserved / padding */
    __u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));
};

我这样初始化结构:

struct can_frame frame2;
frame2.can_id =  0x124;
frame2.can_dlc = 8;
frame2.data[0] = 0x00;
frame2.data[1] = 0x01;

数组创建如下:

struct can_frame frames[2];
frames[0] = frame;
frames[1] = frame2;

稍后,在相同的功能中,但是在while循环中,我试图从数据数组中的一个帧中更改一个字节。首先,我尝试获得指向其中一个框架的指针,以进一步使用它:

struct can_frame* to_change = &(frames[change_frame]);

稍后,我尝试更新以下值之一:

to_change->data[update_index] = anotherRandomNumber;

但是,原始帧中的值不变。我需要做些什么来改变原始值而不是副本的值?

2 个答案:

答案 0 :(得分:1)

根据您的信息,您似乎有错误的期望:

  

但是,原始帧中的值不变。

您给我们看的是这个

首先,为CAN框架准备结构:

struct can_frame frame2;
frame2.can_id =  0x124;
frame2.can_dlc = 8;
frame2.data[0] = 0x00;
...

然后将这个结构放在一个数组中

struct can_frame frames[2];
frames[0] = frame;
frames[1] = frame2;

这是通过将结构的内容复制到数组中来完成的。没有链接返回到数据来源的存储位置。

然后您更改复制的数据:

struct can_frame* to_change = &(frames[change_frame]);
...
to_change->data[somewhatRandomNumber] = anotherRandomNumber;

现在,您希望原始框架发生变化。这不会发生。 将数据从一个位置复制到另一位置(这是在分配中发生的事情)后,您将拥有2个完全独立的位置,它们具有相同的内容。 如果您更改一个位置,则另一个位置不受影响。

如果您想更改frame2,则必须直接修改frame2。这将使阵列中的副本保持不变。您可能需要同时更改两个地方。

您还可以更改数组以保存指向原始结构的指针。这样一来,您只能拥有一个位置的数据。

答案 1 :(得分:1)

我不得不对您想要的内容进行一些猜测,因此不确定是否会这样,但是请告诉我...

在线

struct can_frame frames[2];
frames[0] = frame;
frames[1] = frame2;

我假设frameframe2是另外两个类似于struct can_frame frame, frame2定义的结构,然后进行初始化。

在线

frames[0] = frame;

frames[0]获得frame中数据的副本

所以当你这样做

struct can_frame* to_change = &(frames[change_frame]);
...    
to_change->data[update_index] = anotherRandomNumber;

然后检查frameframe2,它们没有被修改,因为您只修改了frames[]数组中它们的数据的 copy

要更改此设置,您需要使用指向struct can_frame的指针数组:

struct can_frame *frames[2];
frames[0] = &frame;
frames[1] = &frame2;
....
struct can_frame* to_change = frames[change_frame];
to_change->data[update_index] = anotherRandomNumber;