【发布时间】:2018-05-19 17:44:25
【问题描述】:
我对以下 sn-p 代码有几个不同的问题,这是我的一位教授给出的示例。
首先,Thing t{8,15} 是什么?这是一个包含两个整数 8 和 15 的数组吗? 或者这是否将 t(Thing 类型的变量)的 x 和 y 值分别初始化为 8 和 15? 二、上线是什么情况:
std::cout << "n\t = " << place[0] << ", " << place[1];
在我看来它正在打印变量 place 的索引,据我理解,它是一个指向 int 的指针,指向 t 的内存地址处的整数值?
最后,这条线上到底发生了什么:
int y = *( int *)(( char *)& t + 4);
我在这里迷路了。请多多包涵,学习指点和记忆
我正在处理的代码:
struct Thing {
int x , y ;
int* getPlaces () {
return & x ;
}
};
int main () {
Thing t {8 ,15};
int* place = (int *)& t ;
std :: cout << "\nt = " << place [0] << ", " << place [1];
int y = *( int *)(( char *)& t + 4);
std :: cout << "\nt.y = " << y ;
int* location = t . getPlaces ();
location [0] = 17;
std :: cout << "\nt.x = " << t . x ;
}
【问题讨论】:
-
*( int *)(( char *)& t + 4)很讨厌,并且以一种糟糕的方式破坏了 严格的别名。place的使用也是如此。如果您的教授给了您该代码,您应该告诉他或她。 -
我认为这个练习的重点是自己运行代码并查看结果,然后用它来获得理解。
-
@SomeProgrammerDude 它像罪一样丑陋,但不是严格的别名违规,因为该内存位置已经有一个 int 对象。
-
@Frank 这是违规行为,因为代码将
t视为两个int值的数组,但事实并非如此。&t指向int并不重要。&t是指向Thing的指针,而不是指向int的指针,这就是它崩溃的地方。转换为char*可能解决它,但我不太确定。 -
@SomeProgrammerDude 是的,我同意,地点确实是违规行为,我只是在评论您评论的第一部分,抱歉造成混淆。将 g 转换为 char* 确实很好,因为它正在转换为存储。