未定义的行为会导致我的C程序产生不同的结果

时间:2014-04-03 12:23:27

标签: c undefined-behavior

我猜一个未定义的行为会导致我的项目出现问题。为了更好地说明我的问题,我在下面举一个简短的例子:

#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。

2 个答案:

答案 0 :(得分:4)

您拥有pt指向的内存。因此,您可以使用*pt取消引用。这相当于*(pt + 0)pt[0]

事实证明,您可以同时引用pt[0]pt[-1],因为指针算法在您的基础foo数组中已明确定义。

但是你不会在pt[a - b]拥有记忆,因为a - b 不是 -1,而是一个非常大的正数ab是无符号类型,因此结果也是无符号类型。

因此,你得到未定义的行为

未定义的行为正是如此:您可以期待任何发生。

答案 1 :(得分:2)

您从较小的无符号整数中减去一个较大的无符号整数。这会引起流动。结果是一个巨大的数字,可能是2 ^ 32-1。此索引超出了数组边界。那是你正在寻找的UB。