C 动态分配结构数组
我试图创建一个结构数组,数组大小由程序中的用户定义。例如p[0],p[1],p[2]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]; 及 但两者都无法编译
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
应该返回typeint
notvoid
另外,请检查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));