相关疑难解决方法(0)

为什么越界指针算术未定义的行为?

以下示例来自Wikipedia.

int arr[4] = {0, 1, 2, 3};
int* p = arr + 5;  // undefined behavior
Run Code Online (Sandbox Code Playgroud)

如果我从不取消引用p,那么为什么arr + 5单独的未定义行为?我希望指针表现为整数 - 除了取消引用时,指针的值被视为内存地址.

c++ undefined-behavior

27
推荐指数
4
解决办法
5401
查看次数

为什么可以比较最后一个元素?

标准规定:

除非两个指针指向同一个数组对象的元素或者指向数组对象的最后一个元素之后,否则行为是未定义的.

为什么在最后一个元素之后引用一个是有效的?

c c++ memory pointers

3
推荐指数
1
解决办法
105
查看次数

C 编程二维数组内存布局

考虑下面的 C 代码。

#include <stdio.h>
int main(){
   unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6},
                       {7, 8, 9}, {10, 11, 12}};
   printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);
   printf("\n%u, %u, %u", x,&x,*x);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,每个 printf 语句都打印相同的值,如下所述。

6356724, 6356724, 6356724
6356688, 6356688, 6356688
Process returned 0 (0x0)   execution time : 0.128 s
Press any key to continue.
Run Code Online (Sandbox Code Playgroud)

我想知道每个 printf 语句的结果如何相同。这是我对二维数组内存布局的理解。 二维数组内存布局

现在我相信 x+3 指的是( x + 3 * 指针算术所需的大小) = 24 和 *(x +3 ) = *(24) = 2036 …

c arrays multidimensional-array data-structures

2
推荐指数
1
解决办法
543
查看次数