c - 这是未定义的行为吗
问题描述
#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
解决方案
这是 UB 的 5 种不同方式:
它是 UB,因为它不编译。您不是通过 a 访问字符数组
int*
,而是试图将单个字符转换为 aint*
,这不是有效的 C。请参阅“Pointer from integer/integer from pointer without a cast”问题同样,您不能从字符数组隐式转换为整数指针。你需要一个明确的演员表。
修复代码以便编译fun((int*)A, (int*)&A[2]);
,然后在函数中:
a[2]
可能会导致在许多系统上访问错位,这将是 UB。a[2]
int
考虑到它是 32 位,可能是一个数组越界访问。UB。a[2] = a[1] + 6;
通过不兼容的类型对数组进行左值访问。这是“严格的混叠违规”,也是 UB。什么是严格的别名规则?
推荐阅读
- python - 在多个 GPU 上运行detectron2 训练
- react-native - 更改全局状态时如何知道渲染结束
- caching - 以缓存为代价消耗 Linux 机器上的“空闲”内存
- java - java - 如何使用java spring boot通知pod中容器内的事件
- networking - 如何配置两个域以使用相同的 SSL 证书?
- react-native - ReactNative:显示来自本地存储的图像不起作用
- python - 在python中将天数转换为日期
- powerbi - 如何根据 Power BI 中的另一列计算一个值在列表中出现的次数?
- javascript - JS隐藏其他表时如何显示第二个表
- reactjs - 在 axios.post 之外访问 axios 响应