关于new的调用问题

zf0579 2003-03-12 10:41:53
在VC++中 设有两个随机变量n,m
可以采用以下方式为数组动态分配内存:
int *p = new int [n*m];
但是不能采用如下分配方式:
int *p[m] = new int[n][m];
int **p = new int [n][m];
也就是以为一维数组分配却不能为多维数组分配
为什么?
...全文
26 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cutestar 2003-03-12
  • 打赏
  • 举报
回复
在VC下该句不能通过!!!
在DEV-C++下编译却能通过!!!
liu_feng_fly 2003-03-12
  • 打赏
  • 举报
回复
使用vector呀
zf0579 2003-03-12
  • 打赏
  • 举报
回复
to cutestar:
你的程序我没有看明白
m,n没有初始化就cout啦 至少我不会这样写程序
你可能是想比较这两种编译环境对未初始化的m,n的处理方式。
另外在VC++什么编译级别能让int(*p)[n] = new int[m][n]通过?
zf0579 2003-03-12
  • 打赏
  • 举报
回复
to cutestar:
呵呵 m,n强制转换成unsigned int, 至少有一半没有错误 内存分配通过
zf0579 2003-03-12
  • 打赏
  • 举报
回复
to rtdb:
我觉得楼上的说得可能对。但是由于是动态分配 编译前一定需要知道数组大小吗? 可以不需要知道 就定义一个指针int *p。在运行程序后, 当确定一个多维数组各维的维度后 想p = new int [n][m]却不能通过编译 如果是一维的就没有问题。 真是不明白为什么?
cutestar 2003-03-12
  • 打赏
  • 举报
回复
这也是为了安全,也和编译器有关。可以用VC与DEV-C++对比试一试!!!
在编译时,设置不同的编译级别,会有不同的结果!!!比如下面一段程序:
int m,n;
cout<<"m="<<m<<",n="<<n<<endl;
int (*p)[n]=new int[m][n];
delete[] p;
比较m,n的值!!!
另外,没有对变量初始化就使用是不安全的,如果m,n是负数怎么办???
提供new,delete就是为了根据需要,动态分配和释放一段内存。
rtdb 2003-03-12
  • 打赏
  • 举报
回复
多维数组就不能通过 为什么?
我的看法:

因为编译器在不知道维数时无法定位。
例如 int p[n][m];
当m和n是编译期就已知的值时(常量),
后面的语句若是用p[1][2],编译器可以算出它的相对地址。

若是m和n在编译期未知, 编译器就无法算出p[1][2]的地址。
(这个地址是随m的值变化的)。
因此在编译期要求后面的维数是固定的。
这样编译器才知道如何处理p++之类的语句。





bugfree 2003-03-12
  • 打赏
  • 举报
回复
you can take
int *p = new int [n*m];
as int *p[n][m]; for you have got the same size of memory, you can do everything you want.

Detail to look at C++ FAQ for multidimensional array:
http://www.parashift.com/c++-faq-lite/
Coder 青田 2003-03-12
  • 打赏
  • 举报
回复
楼主是问为什么?????我也不清楚,不过,通常分配空间不会按你错误的那种方式。
winco 2003-03-12
  • 打赏
  • 举报
回复
可以这样:
int (*p)[n]=new int[m][n];
或者
int **p=new int*[m];
for(int i=0; i<m; i++)
p[i]=new int[n];
:)
zf0579 2003-03-12
  • 打赏
  • 举报
回复
当然如果m,n换成4,5是常量而不是变量 则以上分配方式是没有问题的
如果m,n是在程序运行后才能确定的数值 则在编译该程序时编译器报错
也就是一维数组能通过 多维数组就不能通过 为什么?
fireseed 2003-03-12
  • 打赏
  • 举报
回复
可以,用realloc
boolean6199 2003-03-12
  • 打赏
  • 举报
回复
多维数组如何在堆中分配可以参考:
http://expert.csdn.net/Expert/topic/1251/1251269.xml?temp=.6928675
我觉得这可能是一个类型方面的问题,我猜测new的时候必须知道new的是什么类型,
int [n][5]可以理解为一个元素类型为int [5]的数组
而int [n][m]就无法确定了
superzjx2000 2003-03-12
  • 打赏
  • 举报
回复
不定长的内存也可以分配吗
FT

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧