C 动态分配结构数组

C 动态分配结构数组,c,memory,dynamic,struct,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]; 及 但两者都无法编译

我试图创建一个结构数组,数组大小由程序中的用户定义。例如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];

但两者都无法编译。 有人能看到这里出了什么问题吗

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

一种可能是您忘记了
#包括
。如果没有原型,编译器将假定
malloc
返回一个
int
,它不会在没有强制转换的情况下转换为指针(但不要使用强制转换——包括正确的头,这样编译器就知道返回类型)


编辑:它是不相关的,但是FWIW,
main
应该返回
int
,而不是
void
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的位置包含头

其次,
main
应该返回type
int
not
void


另外,请检查
scanf
的返回值。
scanf
函数不适合交互式输入。例如,如果用户点击Enter键,
scanf
会一直等待输入,寻找那些数字字符,这是不友好的。
scanf
%d
中检查时也没有错误。如果您输入一个数字at不适用于类型
int
行为只是未定义。这种类型的输入处理只适用于快速且肮脏的“一次性”输入为自己编写的程序。< /p>你得到什么编译错误?什么编译器和编译器错误?如果恰好是C++编译器,它会拒绝程序,因为函数未声明。<代码> main < /C>完全是相关的,因为编译器可以拒绝<代码>空main < /代码>。你永远不知道,NeigBee Co。老师告诉uld使用gcc和
-Werror
:)@Kaz:理论上,是的。根据他的评论,no.stdlib.h当然包括在内,但它仍然不起作用。至于主要的事情,我最近才发现,所以我仍然在努力记着改变它。谢谢。“…1991年”?真的吗?“1999年”也许?谢谢你的详细回复。我确实在扫描后调用了Malc。甚至改变了它的周围的东西,虽然它仍然不起作用。我用HMJD的代码在下面的空白项目中,我仍然得到了我提到的第二个错误。这可能是因为你实际上是用C++编写的。在C++中,你不能分配一个类型为“代码”的指针。空**/COD>到代码>播放器*<代码>。这不是一个类型安全的转换。C中的规则是放松的(即使 Value>代码>类型是C++最初的!)在C++中,你需要像“代码>播放器* p=(播放器*)Maloc(…)这样的演员。你是否保存了一个<代码> .CPP< /Cord>后缀的文件?无论如何,如果你在C++中工作,请标记你的问题C++。
player *p=malloc(numPlayers*sizeof(player));