我猜一个未定义的行为会导致我的项目出现问题。为了更好地说明我的问题,我在下面举一个简短的例子:
#include "stdlib.h"
#include "stdio.h"
#include "stdint.h"
typedef uint32_t ntype_t;
int main(){
int foo[2] = {0, 1};
ntype_t a,b;
int * pt = &foo[1];
a = 1;
b = 2;
printf("%d\n", pt[a-b]);
}
我没有任何选项编译了这个程序,得到了Segmentation fault (core dumped)
。我用-O2
编译了这个程序,结果是0
。问题也与平台有关,我的环境是Ubuntu linux 3.11.0-15-generic + GCC 4.8.1。
答案 0 :(得分:4)
您拥有pt
指向的内存。因此,您可以使用*pt
取消引用。这相当于*(pt + 0)
或pt[0]
。
事实证明,您可以同时引用pt[0]
和pt[-1]
,因为指针算法在您的基础foo
数组中已明确定义。
但是你不会在pt[a - b]
拥有记忆,因为a - b
不是 -1,而是一个非常大的正数a
和b
是无符号类型,因此结果也是无符号类型。
因此,你得到未定义的行为。
未定义的行为正是如此:您可以期待任何发生。
答案 1 :(得分:2)
您从较小的无符号整数中减去一个较大的无符号整数。这会引起流动。结果是一个巨大的数字,可能是2 ^ 32-1。此索引超出了数组边界。那是你正在寻找的UB。