【问题标题】:C - dynamic array of typedef struct with in-function mallocC - 具有函数内 malloc 的 typedef 结构的动态数组
【发布时间】:2015-02-16 13:55:06
【问题描述】:

我再次陷入困境,并且在理解以下代码示例中发生的事情时遇到了很大的问题:

//Filename main.c

    #include<stdio.h>
    #include "entries.h"

    int main(){

        playerEntry *Entry;

        printf("Number of Entries: %d",readPlayerList(&Entry));

        return 0;
    }

它只是简单地调用函数并打印出结果,并且应该能够处理函数在 *Entry 中所做的条目(那时应该是一个数组)

//Filename entries.h
#ifndef ENTRIES_H_
#define ENTRIES_H_

typedef struct {
    char Name[25];
    int Score;
}playerEntry;


int readPlayerList(playerEntry* *feld);


#endif /* ENTRIES_H_ */

现在这里是typedef 和函数原型,保持非常简单和直接,因为它只是(对我而言;()但导致崩溃的未知问题的一个示例

//Filename readPlayerList.c
    #include<string.h>
    #include<stdlib.h>
    #include "entries.h"

    int readPlayerList(playerEntry* *feld) {

        int i = 0, Score = 5001;
        char Name[25] = "Rasputin";

        *feld = malloc(4 * sizeof(playerEntry));

        for(i= 0; i < 3; i++){
            strcpy(feld[i] ->Name, Name);
            feld[i]->Score = Score;
        }

        return i;
    }

这就是废话发生的地方。

我什至不知道如何正确调用它! :(

我的结构是由 malloc 分配的,但仅作为一个元素的“数组”,至少我是这么认为的。一次运行它总是很好,但是每当我尝试在另一个索引上写入时,例如feld[1].Name,它会使程序崩溃,因为显然没有分配空间。如何通过保持结构如图所示来解决?

很难弄清楚如何在函数内部使用 malloc 来实际分配可以在函数外部使用的东西。但我什至不确定这是否是正确的方法。我今天真的读了很多书想弄明白,但是没有什么东西完全适合那里,而且我自己无法填补空白。请帮助,并提前感谢! :)

【问题讨论】:

  • 旁注:我强烈推荐not casting malloc
  • 另外,您的代码看起来对我来说是正确的。你在哪里使用feld[1].Name?您是否尝试过通过调试器运行它,或者可能插入一些调试printf 语句?更新:发现你的问题:feld[i]-&gt;Name 应该是(*feld)[i].Name
  • strcpy((*feld)[i].Name, Name); (*feld)[i].Score = Score;
  • 感谢大家的回答!特别是@Mints97,他给出了很好的解释!我真的尝试了最奇怪的指针构造,指向指向其他任何东西的指针,但是这个带有 prantheses 的指针可以解决问题!刚刚好。谢谢。 :D

标签: c arrays pointers malloc typedef


【解决方案1】:
strcpy(feld[i] ->Name, Name);
feld[i]->Score = Score;

应该是

strcpy( ( (*feld)[i] ).Name, Name);
( (*feld)[i] ).Score = Score;

(添加了冗余括号以便于理解)

这很简单:feld 不是一个指向堆数组的指针,但您可以像使用它一样使用它。它实际上是一个指向堆数组的指针。所以,你基本上是在迭代错误的东西。

在上面的示例中,您首先取消引用 feld,即获取指向您分配的数组的指针。

【讨论】:

  • 这是不正确的。 (*feld[i]).xfeld[i]-&gt;x 相同。您正在寻找(*feld)[i].x(注意括号)。示例:codepad.org/ms6DHUYd(是的,它有UB,但证明这两个是一样的)。
  • @TimČas:天哪,我没有注意到我忘记了*feld 周围的括号!谢谢,我马上更新!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2012-12-27
  • 2012-05-14
  • 2018-11-05
  • 2011-06-26
相关资源
最近更新 更多