c - 未定义的行为导致我的 C 程序出现不同的结果

标签 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。

最佳答案

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

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

但是您不拥有 pt[a - b] 处的内存,因为 a - b 不是 -1 而是 a非常大的正数,因为 ab 是无符号类型,因此结果也将是无符号类型。

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

未定义的行为正是这样的:您可以期望发生任何

关于c - 未定义的行为导致我的 C 程序出现不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22837696/

相关文章:

c - 如何优化此代码并将正在读取的数据排序到数组中?

c - 跟踪程序在 C 中运行了多长时间

c - 如何非线性地打印出数组的内容(例如在 4x4 单元格中)

c - 在c中哪里以及如何使用fwrite函数

c - 是否否定 INT_MIN 未定义的行为?

c - 当我遗漏 C 函数的参数时会发生什么?

c - 错误的合并排序结果

C++ 删除 - 它删除了我的对象,但我仍然可以访问数据?

c++ - 我感觉下面的 f3() 展示了 UB。但是我怎么能确定呢?

c++ - 此代码会产生未定义的行为还是仅仅是未指定的行为?