【问题标题】:struct array pointer as a function parameterstruct 数组指针作为函数参数
【发布时间】:2021-04-03 13:29:55
【问题描述】:

我有一个数据库结构来存储员工信息

struct employeeData
{
   char name[50];
   int age;
   char rank[50];
   char level[50];
   char memo[100];
 };

在这之后,我声明了一个指针数组,这样

struct employeeData *eData[MAX];

在主函数中。

现在,我有一个函数如下...

 void newEmployee(struct employeeData *eData[MAX])
    {
      prinf("name: ");
    
      scanf("%s", eData[Database] -> name);
    
      printf("%s", eData[Database] -> name);
    }

它编译时出现任何错误,当我运行它时,我可以输入员工的姓名,但之后会出现分段错误。

我的问题是什么?

我以为我在 newEmployee 函数中正确使用了指针结构。

【问题讨论】:

  • 您发布的代码将无法编译:函数的参数缺少类型规范。假设这是一个指向您的结构之一的指针,您将需要 struct employeeData *eData 作为参数列表。另外,为什么有一个指针数组?每个都需要在使用前分配(使用malloc);最好有一个结构数组。
  • 你是对的。对不起,我错过了那部分。关于使用 malloc,最好有一个结构数组?我不确定在哪里初始化它。
  • 你应该定义数组:struct employeeData eData[MAX];并将其作为指针传递: void newEmployee(Struct employeeData *eData)
  • struct employeeData *eData[MAX]; 是一个指针,但没有分配内存。

标签: c pointers struct


【解决方案1】:

我修复了您问题中的 3 个语法错误。这个问题不是独立的,所以我们只能猜测你没有向我们展示的代码你做错了什么。 scanf() 不安全,因此请改用 fgets()。 @PaulOgilvie 可能猜对了,您没有为这些指针指向的结构分配内存。

这是一个独立的工作示例,它可能使用@ImanH 建议的想法解决了问题:

#include <stdio.h>
#include <string.h>

struct employeeData {
    char name[50];
    int age;
    char rank[50];
    char level[50];
    char memo[100];
};

void newEmployee(size_t n, struct employeeData eData[n]) {
    for(int i = 0; i < n; i++) {
        printf("name: ");
        fgets(eData[i].name, sizeof(((struct employeeData *) 0)->name), stdin);     
        printf("%s", eData[i].name);
    }
}

int main() {
    struct employeeData e[2];
    newEmployee(sizeof(e) / sizeof(*e), e);
    return 0;
}

如果你想使用你的指针数组,你可以这样做:

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

struct employeeData {
    char name[50];
    int age;
    char rank[50];
    char level[50];
    char memo[100];
};

void newEmployee(size_t n, struct employeeData *eData[n]) {
    for(int i = 0; i < n; i++) {
        eData[i] = malloc(sizeof(struct employeeData));
        if(!eData[i]) {
            printf("malloc failed\n");
            exit(1);
        }
        printf("name: ");
        fgets(eData[i]->name, sizeof(((struct employeeData *) 0)->name), stdin);
        printf("%s", eData[i]->name);
    }
}

int main() {
    struct employeeData *e[2] = {0};
    newEmployee(sizeof(e) / sizeof(*e), e);
    free(e[0]);
    free(e[1]);
return 0;
}

【讨论】:

  • 是的,我注意到 scanf 给了我一些错误。因此,我将其更改为 fgets 并删除了字符串的最后一个字符。我设法学习了 malloc 在这种情况下使用。谢谢
  • 如果你准备好了,请接受答案。为有帮助的答案点赞。
  • 我投了赞成票!感谢您的帮助,我在哪里可以接受答案?
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2021-11-29
  • 2011-02-04
  • 2012-03-07
相关资源
最近更新 更多