首页 > 解决方案 > 这是未定义的行为吗

问题描述

#include <stdio.h>

void fun(int *a, int *b) {
    //printf("%d %d\n", a[2], *b);
    ++b; a[2] = a[1] + 6;
    return;
}

int main(void) {
    char A[5] = {'0', '1', '7', '3', '4'};
    fun(A, A[2]);
    printf("%c", A[2]);
}

我在这里读到char 到 integer 指针的转换,使用访问char数组int*是未定义的行为。该程序与该链接中的程序相似吗?

另外,如果我取消注释函数中的第一条语句,我想知道为什么会出现运行时错误fun

标签: cpointerscastingundefined-behavior

解决方案


这是 UB 的 5 种不同方式:

修复代码以便编译fun((int*)A, (int*)&A[2]);,然后在函数中:

  • a[2]可能会导致在许多系统上访问错位,这将是 UB。

  • a[2]int考虑到它是 32 位,可能是一个数组越界访问。UB。

  • a[2] = a[1] + 6;通过不兼容的类型对数组进行左值访问。这是“严格的混叠违规”,也是 UB。什么是严格的别名规则?


推荐阅读