在C中传递一组结构

时间:2011-11-21 00:27:59

标签: c

我无法将结构数组传递给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和asterisks。我的老师还没有教过我们指针,所以我想用我所知道的来做。

有什么想法吗? :S

编辑:在我修改原型后,Salvatore的答案正在运行:

void ReadFile(struct Items[10]);

9 个答案:

答案 0 :(得分:8)

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

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

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

这在我的编译器中效果很好。 你用的是什么编译器?你得到了什么错误?

请记住在您的函数之前声明您的结构,否则它将无法工作。

答案 1 :(得分:4)

在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;
}

答案 2 :(得分:2)

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

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);

答案 3 :(得分:0)

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

如果你想要相同的struct数组,那么你应该使用指向数组的指针,而不是像创建副本一样传递数组。

void ReadFile(struct Items * items);

你称之为

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

需要小心指针......

答案 4 :(得分:0)

你几乎必须使用指针。你的功能看起来像这样:

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

答案 5 :(得分:0)

您需要使用指向数组的指针,之后才能轻松访问其成员

void ReadFile(Items * items);

应该有用。

答案 6 :(得分:0)

好吧,当你像你一样传递一个结构时,它实际上在函数中创建了它的本地副本。因此,无论您如何在ReadFile中修改它,它都不会影响您的原始结构。

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

答案 7 :(得分:0)

您是否曾尝试声明您的功能如下:

void ReadFile(struct Items[])

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

答案 8 :(得分:0)

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

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

和类似的功能:

void ReadFile(Items *items);

使用typedef定义一个新类型,因此每次都不需要使用单词“struct”。