【问题标题】:Array as a Part of Struct数组作为结构的一部分
【发布时间】:2018-09-23 20:12:41
【问题描述】:

我是 C 的新手,在使用数组作为结构的一部分时遇到了一些麻烦。我有一个结构定义如下:

typedef struct
{
 int row;
 int col;
 int * puzzle[5][5]
} data;

稍后在一个函数中,我尝试按如下方式使用这个结构:

void foo(int grid[5][5])
{
 data *puz = (data *)malloc(sizeof(data));
 puz->row = 3;
 puz->col = 2;
 puz->puzzle = grid;  // causes an error
 }

最后一条语句产生错误“赋值给具有数组类型的表达式”。我知道这与等号和数组数据结构有关,但我不知道如何解决这个问题。任何帮助是极大的赞赏。谢谢。

【问题讨论】:

  • 你应该这样定义你的指针int (*puzzle)[5][5]
  • 显示对foo的调用。
  • 啊,作为错误的副本关闭。您的代码为 2 错误-您可能想要ints 的二维数组-int puzzle[5][5],然后使用memcpy(注意大小,sizeof puz->puzzle!)
  • @kiranBiradar 没有多大帮助,因为 a) 可能这不是真正的意图,b) 将 int *grid[5] 转换为 int (*puzzle)[5][5] 对于新手来说有点棘手
  • kiran Biradar,已修复,非常感谢!

标签: c arrays struct


【解决方案1】:

这...

    int * puzzle[5][5]

... 将puzzle 声明为一个由 5 个数组组成的数组,每个数组有 5 个 指向 int 的指针。通俗地说,我们更常将这种东西称为 5 x 5 数组,但您应该了解的关键是底层的标量元素类型是指针类型。这与函数 foo 的参数的标量元素类型 (int) 不匹配,而且无论如何它不太可能是您想要的。 (另请注意,您的代码在该成员的声明之后省略了所需的分号。)

似乎应该将结构成员声明为 ...

int puzzle[5][5];

...即int 的二维数组。 C 没有整个数组赋值,因此在这种情况下,您需要一种不同的方式将函数参数复制到新结构中。您可以编写一组嵌套循环,但使用memcpy() 更直接:

memcpy(&puz->puzzle, grid, sizeof(puz->puzzle));

万一您希望结构包含指向数组的指针,则可以将其声明为

int (*puzzle)[5];

int (*puzzle)[5][5];

甚至

int *puzzle;

您选择的哪些会影响您分配给成员的方式以及访问int 数组元素的方式。由于我认为这些都不是你真正想要的,所以我把细节留作练习。

【讨论】:

  • 非常感谢,这完全解决了它!我赞成您的回答,但是由于我在这里发帖的频率不高,而且我在这里的声誉
  • @AlexanderNenartovich,我很高兴能够提供帮助。就您而言,作为提出问题的人,您有权通过单击分数左侧的复选标记来“接受”一个答案,无论您的代表如何。这样做表明该问题已得到您满意的回答,并将对该答案的作者给予奖励。这与赞成或反对投票是分开的,并且独立于投票。
  • 就这么做了。谢谢!
【解决方案2】:

我认为您应该使用指向数组的指针调用该函数,并相应地修改函数签名。 但是如果你想复制数组而不是指向它,你应该执行类似 memcpy 的操作。

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 2021-06-27
    • 2014-06-13
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多