首页 文章

C struct malloc&指针数组实现

提问于
浏览
0

我几天前刚开始用C语言编程 . 我现在正在尝试学习结构 .

我有这个程序和 I want to improve it so that my array people is now an array of pointers to structs. 我不知道该怎么做 .

I also want to modify my insert method, to call malloc to create a new struct and set the correct array element pointing to it.

据我所知,malloc是dinamic内存分配但是虽然我已经阅读了一些指南,但我仍然不确定如何使用它 . 另外,在使用malloc之后,还需要在我的程序中进行哪些更改以使其像以前一样工作?

1 回答

  • 1

    如果你想 people 是一个指针数组,你必须这样声明它:

    struct person *people[12];
    

    请记住,声明遵循使用,并且解除引用的优先级低于数组索引;这意味着 *people[i] 的类型为 struct person ,因此 people[i] 是指向 struct person 的指针 .

    要初始化 people 中的每个位置,请调用 malloc() 使指针指向足够大的有效内存位置以容纳 struct person . 它很简单:

    people[i] = malloc(sizeof(struct person));
    

    当你不再需要 people 时,你必须记住释放你分配的每个记忆位置,通过为每个位置 i 调用 free(people[i]) .

    我注意到你声明了数组包含12个结构 . 当有人更改代码时,这可能很危险:当 HOW_MANY 大于12时,它将无法工作 . 您应该声明一个大小相同的数组:

    struct person *people[HOW_MANY];
    

    这可确保您的阵列始终具有所需的空间 .

    UPDATE: 您需要将 insert 声明为接收指针数组而不是结构数组:

    static void insert(struct person * people [],char * name,int age)

    并且 people[i].name 无效 . 由于 people[i] 现在是一个指针,你需要这样做:

    people[i]->name
    

    或者,等效地, (*people[i]).name .

    这同样适用于 people[i]->age . 请记住在 main()insert 内更改此项 .

    另外,考虑将 i 传递给 insert 而不是使用 static 变量,除非您有充分的理由这样做 . 静态变量用于具有内部状态的函数,对我来说, insert 并不是您想要的函数类型 .

相关问题