CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

动态数组怎样定义?

楼主zlxcjy(~您的朋友~)2003-03-04 08:35:35 在 VC/MFC / 基础类 提问

在一个结构体中这样定义为什么不对:  
  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

相关问题

  • 在VB里,动态数组怎样定义?
  • 怎样动态定义一个二位数组
  • 请问再java中怎样定义动态数组?
  • c中怎样动态定义二维数组?谢谢
  • 怎样定义动态字符串数组?
  • 急问!怎样动态定义类对象的数组?
  • 动态定义数组的问题
  • 动态数组重定义的问题
  • 动态二维数组如何定义?
  • javascript如何定义动态数组?

关键词

  • c++
  • c/c++
  • 函数
  • 指针
  • 内存
  • 模板
  • 数组
  • cstring
  • stu
  • 定义

得分解答快速导航

  • 帖主:zlxcjy
  • bhw98
  • wyz_csdn
  • cnshinhwa
  • ripyu
  • ShapeRock
  • yajunmao
  • sjsj
  • lhb_780902
  • bhw98
  • cnshinhwa
  • cnshinhwa

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo