【问题标题】:Passing an array of structs in C在 C 中传递结构数组
【发布时间】:2011-11-21 00:27:58
【问题描述】:

我在将结构数组传递给 C 中的函数时遇到问题。

我在 main 中创建了这样的结构:

int main()
{
    struct Items
    {
        char code[10];
        char description[30];
        int stock;
    };

    struct Items MyItems[10];
}

然后我像这样访问它:MyItems[0].stock = 10; 等。

我想将它传递给这样的函数:

 ReadFile(MyItems);

该函数应该读取数组,并能够对其进行编辑。然后我应该能够从其他函数访问相同的数组。

我尝试了很多声明,但没有一个有效。 例如

void ReadFile(struct Items[10])

我已经环顾四周寻找其他问题,但问题是它们都做得不同,带有 typedef 和星号。我的老师还没有教我们指针,所以我想用我所知道的来做。

有什么想法吗? :S

编辑:在我将原型修复为后,Salvatore 的回答有效:

void ReadFile(struct Items[10]);

【问题讨论】:

  • 这是“真实代码”。我将它与 Visual Studio 2010 一起使用,它可以工作。 :S
  • "Visual Studio" 和"it works" 不能在礼貌的交谈中用在一个句子中。如果您在谈论特定的非标准平台,则必须明确说明;否则人们会认为你在谈论标准语言。
  • 好的,我修好了。希望这足够真实>.

标签: c


【解决方案1】:
struct Items
{
    char code[10];
    char description[30];
    int stock;
};

void ReadFile(struct Items items[10])
{
    ...
}

void xxx()
{
    struct Items MyItems[10];
    ReadFile(MyItems);
}

这在我的编译器中运行良好。 你用的是什么编译器?你遇到了什么错误?

记得在你的函数之前声明你的结构,否则它将永远无法工作。

【讨论】:

  • 谢谢,在我将原型修复为 void ReadFile(struct Items[10]);
【解决方案2】:

在 main 之外定义 struct Items。在将数组传递给 C 中的函数时,您还应该传递数组的长度,因为函数无法知道该数组中有多少元素(除非它保证是固定值)。

正如 Salvatore 所提到的,您还必须先声明(不一定定义)任何结构、函数等,然后才能使用它们。您通常会将结构和函数原型放在较大项目的头文件中。

以下是您的示例的工作修改:

#include <stdio.h>

struct Items
{
    char code[10];
    char description[30];
    int stock;
};

void ReadFile(struct Items items[], size_t len)
{
    /* Do the reading... eg. */
    items[0].stock = 10;
}

int main(void)
{
    struct Items MyItems[10];

    ReadFile(MyItems, sizeof(MyItems) / sizeof(*MyItems));

    return 0;
}

【讨论】:

    【解决方案3】:

    如果您仅在 main 函数体范围内本地声明它,该函数将不会知道类型 struct Items 存在。所以你应该在外面定义结构:

    struct Item { /* ... */ };
    
    void ReadFile(struct Items[]);   /* or "struct Item *", same difference */
    
    int main(void)
    {
      struct Item my_items[10];
      ReadFile(my_items);
    }
    

    这当然很危险,因为ReadFile 不知道数组有多大(数组总是通过衰减指针传递)。因此,您通常会添加以下信息:

    void ReadFile(struct Items * arr, size_t len);
    
    ReadFile(my_items, 10);
    

    【讨论】:

    • 您的代码已经修复了带下划线的错误,但它仍然没有构建 - 我得到了这个:pastebin.com/HxPTcPmL
    • A) 错误与这部分代码无关,B) 现在我们又对语言感到困惑——突然变成了 C++??
    • 大声笑,对不起,我得到了错误的代码,再试一次。那是尝试您的代码
    • 再试一次? Pastebin 不允许您更改内容;您将获得一个新 ID。
    • 这是我正在使用的全部代码,以防你好奇:pastebin.com/YAXHdLtM
    【解决方案4】:

    以这种方式声明,而不是您的声明:

    typedef struct {
            char code[10];
            char description[30];
            int stock;
    }Items;
    

    还有这样的功能:

    void ReadFile(Items *items);
    

    使用 typedef 你定义了一个新类型,所以你不需要每次都使用“struct”这个词。

    【讨论】:

      【解决方案5】:

      您几乎必须为此使用指针。你的函数看起来像这样:

      void ReadFile(Items * myItems, int numberOfItems) {
      }
      

      【讨论】:

        【解决方案6】:

        你需要使用指向数组的指针,然后它很容易访问它的成员

        void ReadFile(Items * items);

        应该可以。

        【讨论】:

          【解决方案7】:

          好吧,当您像以前一样传递结构时,它实际上会在函数中创建它的本地副本。所以不管你在ReadFile怎么修改它都不会影响你原来的结构。

          我不确定是否有不同的方法,这可能无法回答您的问题,但我建议您尝试指针。您肯定会在 C/C++ 中大量使用它们。一旦你掌握了它们,它们就会变得非常强大

          【讨论】:

          • 不正确,你可以试试,C总是通过指针传递数组,你可以在ReadFile中修改,这里不涉及复制。
          • @SalvatorePreviti 你说得对!出于某种奇怪的原因,我理解他想在他的方法中使用结构,而不是数组。 -_-
          【解决方案8】:

          你有没有尝试过这样声明你的函数:

          void ReadFile(struct Items[])
          

          可能会有所帮助: http://www.daniweb.com/software-development/cpp/threads/105699

          【讨论】:

            【解决方案9】:

            为什么不使用将指向数组的指针传递给需要它的方法?

            如果你想要相同的结构数组,那么你应该使用指向数组的指针而不是作为数组传递,因为那样会创建一个副本。

            void ReadFile(struct Items * items);

            以及你在哪里称呼它

            struct Items myItems[10];
            ReadFile(myItems);
            

            需要小心指针...

            【讨论】:

            • 这里不涉及复制,数组永远不会被复制。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-23
            • 2017-09-20
            • 1970-01-01
            • 1970-01-01
            • 2011-04-06
            相关资源
            最近更新 更多