在执行指针算术时有很多未定义/未指定行为的示例 - 指针必须指向同一个数组(或者一个超过结尾),或者在同一个对象内,限制何时可以根据上述进行比较/操作等
以下操作定义明确吗?
int* p = 0;
p++;
Run Code Online (Sandbox Code Playgroud) 我最近进入了一些代码,做了一些有问题的2D数组索引操作.以下面的代码示例为例:
int a[5][5];
a[0][20] = 3;
a[-2][15] = 4;
a[5][-3] = 5;
Run Code Online (Sandbox Code Playgroud)
上面的索引操作是否受到未定义的行为的影响?
考虑以下C代码:
int arr[2] = {0, 0};
int *ptr = (int*)&arr;
ptr[0] = 5;
printf("%d\n", arr[0]);
Run Code Online (Sandbox Code Playgroud)
现在,很明显代码打印5在常见的编译器上.但是,有人可以找到C标准中的相关部分,指出代码实际上有效吗?或者是代码未定义的行为?
我基本上要问的是,为什么&arr在投入时void *与arr投入时相同void *?因为我相信代码相当于:
int arr[2] = {0, 0};
int *ptr = (int*)(void*)&arr;
ptr[0] = 5;
printf("%d\n", arr[0]);
Run Code Online (Sandbox Code Playgroud)
我在这里思考这个问题时发明了这个例子:数组的指针到数组的重叠 ......但这显然是一个独特的问题.