- 论坛徽章:
- 36
|
本帖最后由 cokeboL 于 2011-04-25 17:15 编辑
未定义行为
和 i ++ + i ++ 问题的性质一样
KBTiller 发表于 2011-04-22 08:49
个人觉得这个不算吧。//仔细想想,确实应该是,因为代码中确实不该有这种形式出现,都该是未定义行为。
但对这个问题的结果,a[-1] 对应的解引用操作也就相当于 *(a-1),也就是数组a前面那个int。
至于为什么和 i 的地址相等,这个要看linu内存的格式了吧。可以参考APUE大概第七章那个图:
-------------------
| |
| |
--------------
低地址 | | 堆
| |
| |
| | int i
| | int a[2]
| |
高地址 --------------- 栈
int数组a和int型 i 属局部变量,都在栈空间分配,压栈分配时地址是由高到低分配的,也就是说先分配了数组a,a在高地址,接下来 分配了 i, 中间未分配其他,那么 i 应该在 a 的地址前面挨着,如图,所以 i 的地址正好为a-1,运行结果正常。
当然,如果情况比较复杂就得看具体问题了。
我觉得这种做法应该算数组越界的一种,同样可以导致数据脏吧~
一点拙见,不知道对不对。 |
|