声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2180|回复: 3

[C/C++] 子程序调用时出现的一个非常奇怪的现象,谁能够解释呢

[复制链接]
发表于 2008-11-22 01:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
//子程序调用时出现的一个非常奇怪的现象,谁能够解释呢
//如下程序中主程序main(),访问了子程序GetPointCoord()已释放的变量,这显然是逻辑错误
//但若将错就错,出现一种无法解释的问题

#include "stdafx.h"
#include "stdio.h"
typedef float (*vec3f)[3];
vec3f GetPointCoord()
{
float x[3]={1,8,4};
vec3f point=&x;
//若有下面这两条语句,程序运行N多次,每次都能够输出正确结果;
//但若没有下面这两条语句,运行N多次,没有一次能够得到正确结果,
//不知道这是为什么,有人能够解释吗
float *y=new float;
delete[] y;
return point;//
}
int main(int argc, char* argv[])
{
vec3f a=GetPointCoord();
float* c=*a;
float c0=c[0];
float c1=c[1];
float c2=c[2];
printf("%f\n%f\n%f\n  ",c0,c1,c2);
return 0;
}
回复
分享到:

使用道具 举报

 楼主| 发表于 2008-11-22 01:23 | 显示全部楼层

正确的程序可以如下

正确的程序可以如下:
// testReturn.cpp : Defines the entry point for the console application.
//子程序调用时出现的一个非常奇怪的现象,谁能够解释呢
//如下程序中主程序main(),访问了子程序GetPointCoord()已释放的变量,这显然是逻辑错误
//但若将错就错,出现一种无法解释的问题
#include "stdafx.h"
#include "stdio.h"
typedef float (*vec3f)[3];
float x[3]={1,8,4};
vec3f GetPointCoord()
{

vec3f point=&x;

float *y=new float;
delete[] y;
return point;//
}
int main(int argc, char* argv[])
{
vec3f a=GetPointCoord();
float* c=*a;
float c0=c[0];
float c1=c[1];
float c2=c[2];
printf("%f\n%f\n%f\n  ",c0,c1,c2);
return 0;
}
发表于 2008-11-28 11:39 | 显示全部楼层
1.第一个程序是正确的,去掉
float *y=new float;
delete[] y;
我试了一下,也是可以的。
在main函数中GetPointCoord将返回的point值赋给了自定义变量a,然后释放point所占的内存空间,并没有什么错误。
发表于 2009-1-2 01:11 | 显示全部楼层
建议不要重新定义float。这个是c++中的关键字之一。
float *y = new float;
此时为:
(*vec3f[3] ) (*y) = new (*vec3f[3]);
这样的定义不是自己给自己找麻烦么?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-29 11:53 , Processed in 0.063175 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表