这个代码怎么编译不通过!<怀疑编译器有问题>

once168 2003-12-29 10:33:35
{
typedef int DATA[5];
DATA *pData=new DATA;
}
上面的代码在VC6,VC7均报如下错:
无法从“int *”转换为“DATA (*)”
与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
难道new DATA返回的是int *指针不成?
请问各位大侠给个解释,是MS的编译器错了,还是我理解错了
谢谢
...全文
113 74 打赏 收藏 转发到动态 举报
写回复
用AI写文章
74 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanzhengpeng2 2003-12-31
  • 打赏
  • 举报
回复
等价于:
new int[5][1]
这个是不符合C++语法的。
sharkhuang 2003-12-31
  • 打赏
  • 举报
回复
typedef int DATA[5];
DATA *pData=new DATA[5];

完全错误!


typedef int DATA[5]; 已经说明是数组[5]!
once168 2003-12-31
  • 打赏
  • 举报
回复
最后,大家还有什么见解
不然,下午我就结贴,贴子总不能过年!

祝大家新年快乐!


我会分++!
跟贴均有分(本人除外)
once168 2003-12-31
  • 打赏
  • 举报
回复
谢谢 ross33123()
不过我想也是,指针转成数组的引用合不合法,谁也不知.
ross33123 2003-12-31
  • 打赏
  • 举报
回复
Error NONAME00.CPP 5: Cannot cast from 'int *' to 'int[5] &'

当然 BC3 比较老了,新的C++ 标准对此怎么规定还得去翻一遍
ross33123 2003-12-31
  • 打赏
  • 举报
回复
第四种情况就是我见所未见的了

在 BC3 下编译不通过
once168 2003-12-31
  • 打赏
  • 举报
回复
哦,长见识!
那当new DATA;时是new一个数组,是吧?
可返回的数据使用起来也是很方便,你看一下上面的几种情况
似乎第四种情况的使用才是最正确定,是吗?(指针转换没有超级,都是一级指针的转换<返回指针转换成数组的引用>)

ross33123 2003-12-31
  • 打赏
  • 举报
回复
楼主大概没注意到我在上面引用的C++标准的一段话

that is, the direct-new-declarator is used or the new-type-id or type-id denotes an array type

也就是说采用 数组new 不仅仅是在 new表达式为 new T[N] 的时候

只要 new 出来的对象是数组,就返回数组的首元素

标准规定死的

不是编译器的选择
once168 2003-12-31
  • 打赏
  • 举报
回复
Sorry!又弄错了
数组的引用能删除:经分析可以,两步完成的,第一数组转换成元素指针完全为直接转换
第二删除指针没有问题,所以编译通过是正常的
red-fly 2003-12-31
  • 打赏
  • 举报
回复
X:(錯誤)
typedef int TEST;
TEST pt = new TEST;


V:(正確)
typedef int TEST;
TEST *pt = new TEST;


這兩種 比較,說明 new出來的東東是指針形的

typedef int DATA[5];
DATA *pd = new DATA;
中,pd是一個指針數組,因為左邊的 DATA是一個數組
而右邊的DATA,是一種數據類型,它已不再去分析它是否是一個數據組或者其它 什麼的,所以右邊要加上[x]來和左邊的“數組”相對應起來

個人愚見,請討論和指正
once168 2003-12-31
  • 打赏
  • 举报
回复
Sorry!第四种情况编译正确,我写错了
{
typedef int DATA[5];
DATA &pData=(DATA &)new DATA;
pData[1]=1;
pData[2]=2;
delete pData;//天呀,一个数组的引用竟然能删除(可能是作为指针处理),也不知其它编译器怎样,大家可试试
}
once168 2003-12-31
  • 打赏
  • 举报
回复
也就是说,new DATA;编译器说返回的是一级指针(int *),你还得安二级指针用(或数组指针)
那不又回到了第二种情况{DATA *pDATA;(*pData)[2]=5;}
ft!
once168 2003-12-31
  • 打赏
  • 举报
回复
天呀,在VC70编译时会出现2440错误
error C2440: “类型转换” : 无法从“int *”转换为“DATA”
没有转换为数组类型,但有转换为数组的引用或指针

也就是说
new DATA;你就不能用,即使过了这一关,引用变量也是个问题
唯一的用法只有再次回到第二种情况(编译器白做了)

第四种情况:安上面的误做了修改(改为引用)
{
typedef int DATA[5];
DATA &pData=(DATA & )new DATA;
pData[1]=1;
pData[2]=2;
delete pDATA;//这一步编译肯定出错,经测试果然如此,引用内存不能释放
}
Mr_Ldh 2003-12-31
  • 打赏
  • 举报
回复
这样的编程方法要尽量避免使用。
once168 2003-12-31
  • 打赏
  • 举报
回复
经测试以上第三情况,还是有问题
{
typedef int DATA[5];
DATA pData=(DATA )new DATA;
pData[1]=1;
pData[2]=2;

}
once168 2003-12-31
  • 打赏
  • 举报
回复
昨天想了一晚
我想C++可能是为了我们使用方便,作了一个处理
当DATA为数组的异名时,new DATA;如果返回DATA *要用二级指针访问元素
使用不方便

如下是测试:
1.
{
typedef int DATA[5];
DATA *pData=(DATA *)new DATA;//假设返回DATA*,数组指针
pData[1]=1;//显然错误
pData[2]=2;//显然错误

}
2.
{
typedef int DATA[5];
DATA *pData=(DATA *)new DATA;//假设返回DATA*,数组指针
(*pData)[0]=1;//用起来不便
(*pData)[2]=2;//用起来不便
}
3.
{
typedef int DATA[5];
DATA pData=(DATA )new DATA;//这也是编译器的结果,假设返回int*,元素指针,虽然指针与数组是同一级,但还是会要强转换指针,因为数组与指针并不相同
pData[0]=1;//当然正确
pData[2]=2;//当然正确
此种方式似乎很好笑,似乎new出来一个对象,不是对象的地址,这也就是我为什么发贴的原因
}

综合这三种情况:1,3均要强转换指针(而且1是明显错误用法,可直接排除),2.是正确用法(前提是编译器返回DATA*)但使用不方便,3虽然结果正确(在编译器的支持下),但却将人带入了两个误区,第一new出来一个对象,不是对象的地址,第二new 对象还要强转换指针(从int *转到DATA),这又回到了类型不安全的C,

编译器选择了第三种情况(一个发人深思的情况),第二种情况才是我们想要的(也是合理的)
当然编译器也不坏,目标代码竟然也对了(构造与析构均调用到)
以上问题出现可能与编译器语法分析时,将DATA自接代换为int (*)[]所造成,因为直接代换后,将调用new的第二种形式分配一级数组
以上仅个人观点,不知对否
once168 2003-12-31
  • 打赏
  • 举报
回复
谢谢ross33123()
DATA[N]等价于int[N][5]不是int[5][N],前几位可能是说错了,意思是对的
once168 2003-12-31
  • 打赏
  • 举报
回复
散分,结贴!
HAPPY NEW YEAR!
lanzhengpeng2 2003-12-31
  • 打赏
  • 举报
回复
DATA * p = new DATA;
VC6通不过,IC6警告
DATA * p = new DATA[1];
VC6过,IC6过
从字面来看,对于处理new TYPE和new TYPE[n]是有区别的。但是我们又知道,这种用法在别的类型(非数组类型)是有效的。
int * p = new int;
int * p = new int[5];
我也只好怀疑是编译器的问题。

但是看了
ross33123()
的回帖,算有点领悟:
DATA * p = new DATA;
等价与:
int (*p)[5] = new int [5];
new int [5] 返回的是int *;
所以跟 int(*)[5]是两马事。
DATA * p = new DATA[1]
等价与:
int (*p)[5] = new int [5][1];
new int [5][1]返回的是 int (*)[5];符合,成功!
once168 2003-12-31
  • 打赏
  • 举报
回复
谢谢 sharkhuang(爱情和程序都读不懂)
你这种写法当然"正确",
要知道你写的int *pData=new DATA;这里你只用到了一个DATA的一个信息(可以转成指针),
但还有一个重要的信息是他是元素为5的固定长度的数组,数组与指针用法相似,但是不一样的
数组表明数据是向量特性,而指针并不表示数据具有向量特性,仅是数据的地址而已
加载更多回复(54)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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