【问题标题】:Array of structure type. with pointer inside of structure结构类型数组。在结构内部带有指针
【发布时间】:2018-02-08 17:49:31
【问题描述】:

我遗漏了一些东西,可能很愚蠢,但我已经没有任何想法了,我需要一些帮助。

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

typedef struct person{
    char name[10];
    int *age;
} PERSON;

int main(){
    int i, n;
    scanf("%d", &n);
    PERSON *arr = (PERSON*)calloc(n, sizeof(PERSON));
    for(i = 0; i < n; i++){
        gets(arr[i].name);
        // scanf("%d", arr[i].age);
    }
        for(i = 0; i < n; i++){
        printf("%s", arr[i].name);
//          printf("%d", arr[i]->age));
    }


    return 0;
}

所以,我无法输入或读取任何结构的年龄。 我需要一个人的动态数组,在每个人中,我也需要一个新的动态数组(这是原始代码的简化版本,但错误是一样的)。

我已经评论了我最近的尝试,所以你可以看到我是如何尝试的。

我得到的错误是[Error] invalid type argument of '-&gt;' (have 'PERSON')

【问题讨论】:

  • 不要使用函数gets;它已从标准中删除,这是有充分理由的。

标签: c arrays structure


【解决方案1】:

因为age 是一个不指向任何内存的指针。您必须分配内存并使int* 指向它,或者更改结构定义以包含int。否则,您只是将不确定的指针值传递给 scanf - 这是未定义的行为。你可以这样做

arr[i].age = malloc(sizeof *arr[i].age);
if(!arr[i].age){
    perror("malloc");
    exit(EXIT_FAILURE);
}

然后在scanf 中使用它。 scanf("%d",arr[i].age); 打印出来

printf("%d\n",*arr[i].age);

更自然的解决方案是

typedef struct person{
    char name[10];
    int age;
} PERSON;

并相应地使用它。然后它会像

scanf("%d",&arr[i].age);

printf("%d\n",arr[i].age);

稍微澄清一下错误:

arr[i]->age
\----/

这是一个PERSON 结构实例,您在其上应用-&gt;,这就是错误的原因。

检查malloc,scanf等的返回值,这将帮助您检测可能发生的错误情况。 gets 已弃用。请改用fgets

【讨论】:

  • @coderredoc 只是试图放大,而不是纠正
猜你喜欢
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多