将指向结构数组的指针设置为等于结构数组

时间:2018-10-19 16:34:00

标签: c arrays struct

我有一个结构foo_t,其中有一个指向结构数组bar_t的指针。我也有一个结构spam_t,其中包含一个结构bar_t数组。我的目标是将bar_tfoo_t数组的指针设置为bar_tspam_t数组的指针。

以下程序尝试执行此操作。我的期望是,例如,如果我更改spam->bar[2].var2,我应该会看到反映在foo.bar[2]->var2中的新值。但是,我看不到这种情况。在spam->bar中出现对foo.bar进行更改的唯一实例是如果我更改元素[0]。这里发生了什么?如何正确地将foo.bar指向与spam->bar相同的数组?

#include <stdlib.h>
#include <string.h>

typedef struct {
    uint16_t var1;
    uint16_t var2;
} bar_t ;

typedef struct {
    bar_t    (* bar)[3];
    uint8_t  spare;
} foo_t;

typedef struct {
    bar_t    bar[3];
} spam_t;


void printVar(foo_t foo, spam_t * spam)
{
    printf("foo.bar[0]->var1:  %d\n",   foo.bar[0]->var1);
    printf("foo.bar[1]->var1:  %d\n",   foo.bar[1]->var1);
    printf("foo.bar[2]->var1:  %d\n",   foo.bar[2]->var1);

    printf("spam->bar[0].var1: %d\n",   spam->bar[0].var1);
    printf("spam->bar[1].var1: %d\n",   spam->bar[1].var1);
    printf("spam->bar[2].var1: %d\n\n", spam->bar[2].var1);

    printf("foo.bar[0]->var2:  %d\n",   foo.bar[0]->var2);
    printf("foo.bar[1]->var2:  %d\n",   foo.bar[1]->var2);
    printf("foo.bar[2]->var2:  %d\n",   foo.bar[2]->var2);

    printf("spam->bar[0].var2: %d\n",   spam->bar[0].var2);
    printf("spam->bar[1].var2: %d\n",   spam->bar[1].var2);
    printf("spam->bar[2].var2: %d\n\n", spam->bar[2].var2);
}

int main(int argc, char * argv[])
{
    printf("Start...\n");

    foo_t    foo;
    spam_t * spam = (spam_t *)malloc(sizeof(spam_t));

    memset(&foo, 0, sizeof(foo_t));
    memset(spam, 0, sizeof(spam_t));

    foo.bar = &(spam->bar);

    printVar(foo, spam);

    spam->bar[0].var1 = 1;
    spam->bar[1].var1 = 1;
    spam->bar[2].var1 = 0;

    spam->bar[0].var2 = 2;
    spam->bar[1].var2 = 1;
    spam->bar[2].var2 = 0;

    //foo.bar[2]->var2 = 3;

    printVar(foo, spam);

    free(spam);

    printf("Done...\n");

    return 0;
}

2 个答案:

答案 0 :(得分:1)

您正确地将数组的地址分配给了指针,但是我认为访问元素的方式不正确。

您应该更改

foo.bar[0]->var1

(*foo.bar)[0].var1

foo.bar[0]->var1等效于(*foo.bar[0]).var1。但是由于foo.bar是指向数组的指针,因此您要先取消引用该指针,然后再应用数组预订。因此,您应该写(*foo.bar)[0].var1

答案 1 :(得分:0)

问题在于{ "key": "cmd+k cmd+left", "command": "workbench.action.focusLeftGroup" } { "key": "cmd+k left", "command": "workbench.action.moveActiveEditorGroupLeft" } 是指向大小为3的foo.bar数组的指针。因此,当您使用foo.bar [1]时,您将超出该数组。

解决这个问题的一种可能方法是使用大小为1的数组:

bar_t

这将触发警告,指出应该兼容的指针类型。但这确实可以按照您想要的方式工作。

但是,当然,您希望以更适当的方式重写它,但这至少证明了问题出在数组的步长上。