动态数组怎样定义?
在一个结构体中这样定义为什么不对:
struct student
{
int no.;
CString name;
CString class[];
}
问题点数:100、回复次数:32Top
1 楼bhw98(bhw98)回复于 2003-03-04 08:44:42 得分 5
struct一定要有确定的大小,CString class[]长度未知,违反了这个原则。如果class有多少个,是不定的,可定义为
struct student
{
int no; // 4 bytes
CString name; // 4 bytes
CString *class; // pointer, 4 bytes
}
用的时候,就要new, delete了。
Top
2 楼wyz_csdn(网语者)回复于 2003-03-04 08:45:10 得分 5
你应该定义成CString* pStr;
初始化时用pStr = new CString[SIZE];
或者用CStringArrayTop
3 楼yajunmao(oldcat)回复于 2003-03-04 08:45:16 得分 0
struct student
{
int no.;
CString name;
CString class[12];
}
or
struct student
{
int no.;
CString name;
CString class[]={"dddd","ddd"};
}
因为数组是预先分配好内存的,所以必须指定他的大小
Top
4 楼dizzo(cepb)回复于 2003-03-04 08:45:26 得分 0
class是c++的关键字啊。
动态数组用CArray<...>模板Top
5 楼zlxcjy(~您的朋友~)回复于 2003-03-04 08:55:18 得分 0
至于楼上说得class是c++的关键字,我只是随便写写举个例子说明问题而已。
那问个问题,假如我想使class数组是个全局变量,如果用new分配岂不是就变成了局部变量了。Top
6 楼cnshinhwa(月夜森林)回复于 2003-03-04 08:59:39 得分 10
CString** a_ppStr;
a_ppStr=new CString*[100];
a_ppStr[0]=new CString();Top
7 楼yifeng_ch(yifeng)回复于 2003-03-04 09:12:57 得分 0
结构没法动态生成,所以类型及大小必须固定。
楼主的问题可以用指针来实现。Top
8 楼liangs(网络杀手)回复于 2003-03-04 09:16:17 得分 0
建议使用CArray。Top
9 楼ripyu(抢分的恶狼)回复于 2003-03-04 09:18:47 得分 5
CStringArray
Top
10 楼thingking(【深水冒泡 (先把书读厚,再把书读薄,最后把书读厚)】)回复于 2003-03-04 09:20:25 得分 0
c/c++根本不支持动态数组。c/c++是编译型的语言,系统在编译时需要确切的知道要为数组分配多大的存储空间,这一点很重要。正如楼上所说,这个问题可以用指针来解决。Top
11 楼shitalone(西特龙)回复于 2003-03-04 09:25:15 得分 0
关注中Top
12 楼zlxcjy(~您的朋友~)回复于 2003-03-04 10:42:54 得分 0
其实我想采用动态的目的是为了省空间,因为我用了太多的数组开辟了太多的空间以至于老出现内存不足的错误!
敢问各位:如果用指针的话假如在CDialog::OnAdd()函数中为指针分配空间,那么在该类的别的函数CDialog::OnDelete()中是否可以直接引用,举个例子
struct student
{
int no;
CString name;
CString *class;
}stu;
CDialog::OnAdd()
{
stu.class=new CString[100];
stu.class[1]="English";
stu.class[2]="Chinese";
}
那么在CDialog::OnDelete()
{
CString sCourse;
sCourse=stu.class[2];//这样引用对不对?
}
各位尽情发言,分不够再加!!Top
13 楼ShapeRock(精灵)回复于 2003-03-04 10:45:34 得分 5
要想定义动态数组,有几个方法。
1.用STL
2.用模板
3.用newTop
14 楼zlxcjy(~您的朋友~)回复于 2003-03-04 10:57:26 得分 0
用模板、stl怎么用,能否指点一二?
谢谢Top
15 楼zlxcjy(~您的朋友~)回复于 2003-03-04 11:15:39 得分 0
还有个问题,如果用new的话对应delete怎么用,例如
struct student
{
int no;
CString name;
CString *course;
}stu;
stu.course=new CString[100];
delete stu.course或者delete stu.course[100]都出错!到底怎么用Top
16 楼yajunmao(oldcat)回复于 2003-03-04 11:42:01 得分 10
try delete []stu.courseTop
17 楼zlxcjy(~您的朋友~)回复于 2003-03-04 13:56:25 得分 0
为节约空间起见,能否边用边开辟?
或者如果预先开辟一些,等用不着的话把多余的释放。
例如stu.course=new CString[100];而我只用了50个,怎样才能释放剩下的50个空间?Top
18 楼fengzi_zhu(吃白菜补VC)回复于 2003-03-04 14:43:22 得分 0
当你发现只用了50个的时候,再new CString[50],将指针指向它。然后释放以前的100。
看看CString是怎么动态分配的吧!Top
19 楼dy_paradise(小耳朵)回复于 2003-03-04 14:50:49 得分 0
class是C++的关键字,当然是一定不行了,Top
20 楼yajunmao(oldcat)回复于 2003-03-04 15:30:50 得分 0
例如stu.course=new CString[100];而我只用了50个,怎样才能释放剩下的50个空间?是不好办的,因为CString[100] 在内存分配描述表中只有一个标识,而释放内存就是改变内存分配描述表Top
21 楼sjsj(虚怀若谷)回复于 2003-03-04 15:33:16 得分 0
敢问各位:如果用指针的话假如在CDialog::OnAdd()函数中为指针分配空间,那么在该类的别的函数CDialog::OnDelete()中是否可以直接引用,举个例子
----------------------------------------------------------
answer:你如果要在这两个函数中使用同一个变量,那么这个变量作用域要达到这两个函数。你可以使用全局变量,或者该类的成员变量。也即定义的在类的外部,或者定义在类的声明中。但是定义在函数中是不妥当的。推荐使用类的成员变量Top
22 楼sjsj(虚怀若谷)回复于 2003-03-04 15:43:52 得分 10
对于整个问题可以这样考虑:
1、你定义一个student类
class student
{
public:
int no;
CString name;
CString *course;
student(int no1,CString name1,int i){no=no1;name=name1;course=new CString[i]}
~student(){delete [] course;}
}
2、在对话框类中添加student类成员变量
3、在CDialog::OnAdd()使用该成员
4、在CDialog::OnDelete()没有必要再删除了,作为类的成员变量,在类对象析构的时候,成员也会跟着析构。调用student类析构函数的时候自动清除内存
Top
23 楼dg115(蛤蟆)回复于 2003-03-04 16:01:47 得分 0
关注中Top
24 楼lhb_780902(逐日)回复于 2003-03-04 16:11:05 得分 10
结构体要求的长度是固定的, 可以用如下的方法
#include "stdafx.h"
#include <afxwin.h>
typedef struct tagDemo{
int n;
CStringArray strArray;
/*
* ... ...
*/
}Demo;
int main(int argc, char* argv[])
{
CString str = "aaa";
Demo demo;
demo.strArray.Add(str);
/*
* ... ...
*/
demo.strArray.RemoveAll();
return 0;
}Top
25 楼bhw98(bhw98)回复于 2003-03-05 08:26:33 得分 10
动态分配内存其实很简单,你需要分配多少可以在分配前指定,而不一定是常数,如
int nCount;
nCount=50; // 可以用任何方法指定nCount,比如键盘输入,从数据库里得知等
stu.course=new CString[nCount];
Top
26 楼liu_feng_fly(笑看风云 搏击苍穹 衔日月)回复于 2003-03-05 08:52:04 得分 0
使用vector吧,动态的,自动增长大小Top
27 楼cnshinhwa(月夜森林)回复于 2003-03-05 08:56:34 得分 10
正因为CString类型不是固定大小的类型,所以不能声明为数组,new出来的每块内存前后都有边界校验和一些内存管理信息,如果内存越界访问,delete的时候就会出错。
解决方案1:定义一个CString** pp的指针,用这个指针new你想要的个数的数组,数组中的每个元素,都指向一个CString类型(即CString*类型),然后再用每个元素去new你需要的CString类型。
delete[] pp即可。
解决方案2:CStringArray
Top
28 楼zlxcjy(~您的朋友~)回复于 2003-03-05 15:02:25 得分 0
用new怎样定义二维数组,用Student stu=new Student[10][10];错误,怎么做好Top
29 楼cnshinhwa(月夜森林)回复于 2003-03-05 15:40:41 得分 20
Student** stu=new Student*[10];
stu[0]=new Student[10];
stu[1]=new Student[10];
.
.
.
stu[9]=new Student[10];
Top
30 楼zlxzgx()回复于 2003-03-05 17:22:56 得分 0
问个问题,为什么一定要在结构体中定义,用个类不行吗Top
31 楼microsoftwin(流星雨点)回复于 2003-03-05 17:53:05 得分 0
在C++中struct和class差不多是等价的,差异就在访问属性上面Top
32 楼seeQe(:红星红星我爱你:)回复于 2003-03-05 18:20:32 得分 0
upTop




