【问题标题】:Trouble Passing array of Structs using pointers使用指针传递结构数组时遇到问题
【发布时间】:2015-02-24 05:36:00
【问题描述】:

我在使用用于写入数组元素的函数时遇到问题。

我认为这可能是因为我没有正确传递结构数组。我想知道是否有人可以指出如何正确地做到这一点。我一直在搞砸而不是修复它。

假设我有一个函数menu.c 我声明我的结构newPerson person[MAX_PERSONS]; 然后我运行我的函数addPerson(person, &num); 以下是

void addPerson(newPerson *pers, int *num){
    pers[*num] = (newPerson) {
                    "Michelle", "Leo", "6136458798", STUDENT,
                    .data = {.s = {9, 1234.50, 3}}
                };
    *num = *num + 1;
}

它运行,但不能正确打印出来,我猜是因为它没有写到我想要的位置pers[num]。我也尝试以这种方式调用函数 addPerson(&person, &num); 而不仅仅是 addPerson(person, &num); 但随后我收到此错误

警告:从不兼容的指针类型传递“addPerson”的参数 1 [默认启用]

注意:预期为“struct newPerson ”,但参数类型为“struct newPerson ()[20]”

我也尝试将函数更改为void addPerson(newPerson *pers[], int *num){,但那里什么也没有。想知道是否有人可以指出我在这里做错了什么以及如何解决我的问题。任何帮助将不胜感激,谢谢!

忘了提到 addPerson 函数在我运行它的某些地方有效。

int menu(int num) {
    newPerson person[MAX_PERSONS];
    //printf("THE NUMBER START OF MENU IS %d\n", num); test counter

    //addPerson(person, &num);    <- WRITES AND READS PROPERLY IF DONE HERE

    int option;
    printf(
            "\n\tPlease choose one of the following options to continue (0-9): ");
    scanf("%d", &option);


if (option == 1) { //program will ask for name input
    addPerson(person, &num);  <- HOWEVER IT DOES NOT WRITE OR READ PROPERLY HERE
    menu(num);
}

这两个函数都在menu.c 中调用 但是,当我在 if 语句中调用 addPerson 时,它无法正确写入/读取。

刚刚通过将结构声明为静态来解决问题! static newPerson person[MAX_PERSONS];

我不确定这是禁忌还是什么,但它解决了我的问题!

【问题讨论】:

  • 我会大胆猜测您正在越界访问person。在addPerson 中使用之前num 的值是多少?
  • 问题是person数组是一个局部变量,你递归调用menu函数。

标签: c arrays struct arguments


【解决方案1】:

通过设置静态,您使代码作为内存的效率低下 数据结构已经被搁置不管是否 程序执行时是否需要。(使用静态数据 结构,结构的大小是固定的。)

像这样声明函数

void addPerson(newPerson *pers[],int *num)

像这样调用函数

void addPerson(newPerson *pers, int *num);

void addPerson(newPerson pers[], int *num);

【讨论】:

  • 声明函数如 void addPerson(newPerson *pers[],int *num) 调用函数如 void addPerson(newPerson *pers, int *num);或 void addPerson(newPerson pers[], int *num);
【解决方案2】:

我可以通过将结构声明为静态来使其工作

static newPerson person[MAX_PERSONS];

不确定这是实际修复还是只是掩盖了我的问题。

【讨论】:

  • MAX_PERSONS 的值是多少?你有足够的堆栈空间吗?
  • 这是解决person 数组是局部变量问题的一种方法。但是,您仍然有递归问题。如果menu 函数调用自己,堆栈将增长,直到堆栈溢出并且程序崩溃。如果没有看到更多的程序,很难建议如何解决问题。发布MCVE 会让这个问题更容易回答。
猜你喜欢
  • 2011-07-28
  • 2015-01-07
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多