首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++ 结构体生命周期的有关问题

2012-09-10 
c++ 结构体生命周期的问题typedef struct {double x, y} POINTPOINT mkpoint1(double x, double y) {POI

c++ 结构体生命周期的问题
typedef struct {
  double x, y;
} POINT;

POINT mkpoint1(double x, double y) {
  POINT temp;
  temp.x = x;
  temp.y = y;
  return temp;
}
c++不是很注重生命周期的管理吗?temp作为局部变量,返回的时候为什么没有报错?难道temp不是放在堆栈中的?


POINT * mkpoint2(POINT * point2) {
  POINT * temp2;
  temp2->x = point2->x;
  temp2->y = point2->y;
  return temp2;
}
temp2也是局部变量啊,为什么也可以呢?
再不行我要去反汇编了!大家给解释下

[解决办法]
编译的时候可通过,不一定代码运行时不出错
[解决办法]
返回就是拷贝一份,第一个是拷贝一份对象,第二个是拷贝一份指针(也就是地址值)。
要照你原来的想法,局部变成不能直接返到外边的话,那以下代码也不行了:

C/C++ code
int f() {    int i = 5;    return i;}
[解决办法]
另外你的第二个程序是错的。
[解决办法]
顶楼上
第一个没错,拷贝了一份
第二个可以编译通过,但运行肯定会出错,temp2是无效的指针,会被初始化为随机值,指向一个没有分配过的内存地址...
[解决办法]
当返回值是基本数据类型, 类,结构体时,返回的时一份新的拷贝.你可能通过观察temp地址和返回后的POINT的地址,你就知道了.跟返回int这类的基本类型是一样的道理.


[解决办法]
探讨
引用:

C/C++ code


POINT mkpoint1(double x, double y) {//返回的是确定的值(对象)而不是引用或者地址
POINT temp;
temp.x = x;
temp.y = y;
return temp;//所以没有问题的
}
c++不是很注重生命周期的管理吗?temp作为局部变量,返回的时候为什么没有报错?难道……

[解决办法]
探讨
C/C++ code



POINT mkpoint1(double x, double y) {//返回的是确定的值(对象)而不是引用或者地址
POINT temp;
temp.x = x;
temp.y = y;
return temp;//所以没有问题的
}
c++不是很注重生命周期的管理吗?temp作为局部变量,返回的时候为什么没有报错?难道temp不……

热点排行