C语言 函数调用一个由malloc获得的指向多个结构体大小的首地址,如何给这个储存空间赋值?

发布于 2022-09-02 01:19:06 字数 1959 浏览 30 评论 0

struct person {
    char id[11];
    char name[21];
    char sex[7];
    int age;
    char phone[12];
};

void input_info (struct person *info[], int total_people) {
    int counter;
    for (counter=0; counter<total_people; counter++){
        scanf("%s", &info[counter].id);
        scanf("%[^\n]", &info[counter].name);
        scanf("%s", &info[counter].sex);
        scanf("%d", &info[counter].age);
        scanf("%s", &info[counter].phone);
    }
}

int main (void) {
    struct person *person_info = malloc(sizeof(struct person)*3);
    input_info(&person_info, 3);

    free(person_info);
    return 0;
}

新手,写一个简单的人物信息记录程序
我的思路是创建一个结构体,然后用malloc申请人数x结构体大小的内存,用于存放人物信息,上面是我的代码(精简到了只涉及此问题以及编译器报错的部分)。

但是编译器给出了这样的错误提示:

person_infor_sys.c: In function 'input_info':
person_infor_sys.c:41:29: error: request for member 'id' in something not a structure or union
   scanf("%s", &info[counter].id);
                             ^
person_infor_sys.c:44:33: error: request for member 'name' in something not a structure or union
   scanf("%[^\n]", &info[counter].name);
                                 ^
person_infor_sys.c:47:29: error: request for member 'sex' in something not a structure or union
   scanf("%s", &info[counter].sex);
                             ^
person_infor_sys.c:50:29: error: request for member 'age' in something not a structure or union
   scanf("%d", &info[counter].age);
                             ^
person_infor_sys.c:53:29: error: request for member 'phone' in something not a structure or union
   scanf("%s", &info[counter].phone);
                             ^

导致此问题的原因是什么?应该如何解决?

由或者说我这样使用malloc来储存多个结构体的思路本来就是错误的?


更新:01-25-2016

我又将这个问题搬到了Stack Overflow

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

多彩岁月 2022-09-09 01:19:06

你传进去的是个二阶指针, 要先解info得到一个一阶指针, 再用那个一阶指针计算

 scanf("%s", &(*info)[counter].id);

但是input_info反正不改变指针指向的, 其实不传二阶指针能省事很多:

 void input_info (struct person info[], int total_people) {
     scanf("%s", &info[counter].id);
 }
相思碎 2022-09-09 01:19:06

将input_info里面的scanf函数中的取地址去掉试试

鹿! 2022-09-09 01:19:06

比如 "&info[counter].id", 应该是 "info[counter]->id".
不需要对 info 取址, info 已经是指向指针的指针.
用 info[counter] 引用后得到的是一个指向结构的指针.
这时需要用 "->" 得到结构里的数据.
info[counter]->id 等于 *(info[counter]).id


稍微改了一下.

void input_info (struct person *info, int total_people) {
    int counter;
    for (counter=0; counter<total_people; counter++){
        scanf("%s", info[counter].id);
        scanf("%[^\n]", info[counter].name);
        scanf("%s", info[counter].sex);
        scanf("%d", &info[counter].age);
        scanf("%s", info[counter].phone);
    }
}

int main (void) {
    struct person *person_info = malloc(sizeof(struct person)*3);
    input_info(person_info, 3);

    free(person_info);
    return 0;
}

果然是因为无还不太了解 scanf 的原因.
因为 scanf 接受的是指针, 字符串已经是指针, 所以只有 info[counter].age 需要用取址.
还有 scanf 的用法上好像还是有一点问题, 比如第二行 scanf

梦初启 2022-09-09 01:19:06

void input_info (struct person *info[], int total_people) {

int counter;
for (counter=0; counter<total_people; counter++){
    scanf("%s", info[counter]->id);
    scanf("%[^\n]", info[counter]->name);
    scanf("%s", info[counter]->sex);
    scanf("%d", &info[counter]->age);
    scanf("%s", info[counter]->phone);
}   

}

改成这样,编译通过。你这传进来的参数如楼上所说是个二级指针,再取下标counter之后的元素还是个指针。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文