数组的负数下标会访问到哪里

学术版

yiming564 @ 2024-11-29 16:29:37

假设全局变量有:

int64_t a, b, f[MaxN], p[MaxN];

我访问 p[-1] 是否会一定访问到 f[MaxN - 1]

换句话说,对于 g++-9,全局变量的内存地址上的布局是否和声明顺序一致?


by bsdsdb @ 2024-11-29 16:33:02

@yiming564 应该不是


by bsdsdb @ 2024-11-29 16:33:51

@yiming564

int c[3];
int b[3];
int a[3];

int main() {
    c[2] = 114514;
    a[2] = 1919810;
    cout << b[-1] << endl;
    return 0;
}

我这里输出0


by _cbw @ 2024-11-29 16:33:58

开 O2 很可能不是

而且这是未定义行为,编译器可能直接把它优化掉(删掉 or 其它神秘行为


by _cbw @ 2024-11-29 16:35:23

总之这么写可能会挂得很惨


by konyakest @ 2024-11-29 16:37:01

未定义行为


by kbzcz @ 2024-11-29 16:38:02

但这样写确实会挂的很惨吧,没用过linux不知道会不会爆


by Dangerise @ 2024-11-29 16:39:30

@yiming564 未定义行为,开 O2 的情况下什么都可能发生


by yiming564 @ 2024-11-29 16:45:26

好奇怪,我在 Linux 下开不开 O2 都测了,结果都符合预期。


by yiming564 @ 2024-11-29 16:46:11

@bsdsdb int * 3 是 12 个字节会触发内存对齐,所以访问到了 0(也许?)


by bsdsdb @ 2024-11-29 16:47:00

@yiming564 数组大小开到4,初始化下标改成3还是输出0


| 下一页