65,211
社区成员
发帖
与我相关
我的任务
分享struct PEOPLEINFO
{
long lID;
char cName[100];
int nAge;
char cSex;
};
PEOPLEINFO p[m];//这肯定编译不过的
不见得吧
如果m是常量是可以的,比如,在linux下们的gcc是可以通过的
m = 10;
const int n = n;
PEOPLEINFO p[n];
这个windows下不能通过,呵呵,但是如果之前#define是可以的
#define m 10
PEOPLEINFO p[m];
也是可以的。
其实c或c++标准都规定了数组的定义大小一定要一个常量。
当然下面的肯定是可以的,因为动态分配目标就是动态的分配,不会限制你的分配大小
PEOPLEINFO* p=new PEOPLEINFO[m];
PEOPLEINFO p[m];//这肯定编译不过的
查了一些资料后觉得要用下面的方式解决:
PEOPLEINFO* p=new PEOPLEINFO[m];
可是我不理解这是怎么回事?
这个就是动态分配内存嘛!在运行之前,栈的大小是固定的!也就是已知的!
对于PEOPLEINFO p[m];这样的东西,我们分配的空间是在栈上!那么,在编译的时候,根本不知道m的具体值,你可能在某个地方修改了这个m(编译器这么假设)
所以,根本不能知道应该给分配多大的栈!所以编译不过!可以将m申明为const就行!它是不可修改的,那么编译器就认为你不可能在别的地方修改这个m,所以能通过
那么用new呢?因为我们知道,new、malloc都是在堆上分配大小,在运行前,堆的大小是不知道的,只是在运行的时候,动态的分配!第一次运行程序,new的可能是这个地址,第二次,又可能是另一个地址!
所以可以用new来实现动态分配!
不知道我说明白没?
还有给结构体数组中的lID,cName[100]怎么赋值呀?
谢谢了!
这个赋值很简单啊!
因为是结构体,默认方式是public访问,所以可以直接赋值:
long 是long int 的缩写,可以直接
结构体指针->lID = 10;
或者:结构体.lID = 10;
cName可以用memcpy来赋值
比如:
memcpy(结构体指针->cName,"hello");
memcpy(结构体.cName,"hello");
也可以!
#include <cstdlib>
#include <iostream>
struct PEOPLEINFO
{
long lID;
char cName[100];
int nAge;
char cSex;
};
using namespace std;
int main(int argc, char *argv[])
{
int m=10;
PEOPLEINFO p[m];
system("PAUSE");
return EXIT_SUCCESS;
}