动态分配结构数组

时间:2012-03-11 20:43:08

标签: c memory dynamic struct

我正在尝试创建一个结构数组,其数组大小由程序中的用户定义。例如。 p [0],p [1],p [2] .....

typedef struct
{
int score;
}player;

void main()
{
    int numPlayers;

    printf ("\nEnter number of players (1 - 4)\n");
    scanf ("%d", &numPlayers);

}

我尝试过用

做这件事
player p[numPlayers];

player *p=malloc(numPlayers*sizeof(player));

但两者都不会编译。 谁能看到这里出了什么问题?

编辑:我正在使用VS2010。 我得到第一个“表达式必须具有常量值”,并且“类型值”void *“不能用于初始化第二个类型”player *“的实体。

2 个答案:

答案 0 :(得分:1)

一种可能性是你忘记了#include <stdlib.h>。如果没有它的原型,编译器将假设malloc返回int,它不会转换为没有强制转换的指针(但不使用强制转换 - 包括正确的头,所以编译器知道返回类型。)

编辑:这是无关的,但FWIW,main应该返回int,而不是void

答案 1 :(得分:1)

player p[numPlayers];方法需要“可变长度数组”。这是多年前出现在GNU C方言中的一个特性,并于1999年被采用到C语言中。要编译它,需要一个将其识别为扩展或C99编译器的编译器。可变长度数组有一个缺点:它们通常通过在堆栈上分配内存来实现。无法检测是否有足够的内存。

你拥有的malloc调用语法很好:

player *p=malloc(numPlayers*sizeof(player));

但是,如果你想在你的函数中的任何地方写这个,你需要使用一个C99编译器,或者一个接受混合语句和声明的编译器(比如GNU C,它已经将它作为一个扩展多年了C99并默认接受它。在C90中,你必须在函数(或括号语句)顶部的声明块中声明指针:player *p = NULL;。然后,在知道了玩家数量之后,分配给它p = malloc ...

您应该发布不编译的实际程序。没有它我们只是猜测!

而且,你有一些问题。

首先,如果要调用malloc,则应该包含声明malloc的标头<stdlib.h>

其次,main应该返回int类型而不是void

另外,检查scanf的返回值。 scanf函数对交互式输入不利。例如,如果用户点击Enter,scanf会一直等待输入,寻找那些不友好的数字字符。 scanf中的%d也没有错误检查。如果输入的数字不适合int类型,则行为根本未定义。这种类型的输入处理仅适用于为作者自己使用而编写的快速“一次性”程序。