【发布时间】:2017-12-20 20:38:10
【问题描述】:
typedef struct
{
int a[2];
double d;
}struct_t;
double fun(int i)
{
volatile struct_t s;
s.d = 3.14;
s.a[i] = 1073741824;
return s.d;
}
【问题讨论】:
-
想想 int 的 sizeof,double 的 sizeof,以及在这个例子中保证可写的内存。
-
您的实际问题是什么?你到底有什么不明白的?
-
double fun(int i) { if (i < 0 || i > 1) {.. handle error ..} ...}怎么样? -
什么让你困惑?解释是混合字节和位。 a[i] 是一个字节,d0, d1... 是位。如果你写一个超出 a[1],你就超出了范围;您正在分配给 d 的空间中写作。如果你在 a[3] 之外写作,那么你是在一个不属于你的结构的空间中写作。
-
它告诉您,当您超出数组边界时,您不会总是遇到访问冲突。这种情况也发生在基于堆栈的数组上。只有当您超出堆栈框架/分配的内存时,您才会得到它
标签: c++ c cpu-architecture