使用未初始化的2d指针解除引用和解决运算符行为

时间:2015-05-10 21:29:12

标签: c pointers operands

我不清楚这句话:

int **ptr;
printf (" %p \n", &( *( *(ptr + 1) + 4) ) );

确实,我无法解释自己为什么在运行时没有遇到段错误,因为它不应该使用*操作数和一个应该是的数字 返回值为*(ptr + 1)

1 个答案:

答案 0 :(得分:0)

C是一种语言,旨在出于性能原因在某种程度上反映硬件的性质。它在大多数情况下也是静态编译的,需要提前编译和链接整个代码库。因此,它不必提前检查每个可能的人为错误。好的可能会在这里发出警告,但没有一个会产生错误。

在运行时,您的代码正在执行的是调用未定义的行为。正如其他人在评论中提到的那样,未定义的行为并不意味着崩溃。实际上,有时崩溃是在这种情况下可能发生的最理想的行为,因为调试器可以立即为您提供有关错误的信息。在不太理想的情况下,程序可能似乎运行正常,除了偶尔,当满月出来时,行为不规则地改变。它可以从编译器到编译器,从构建设置到构建设置,从平台到平台不等,所以你真的想尽可能地避免它们。

实际上,当您尝试访问读取访问权限而不是写入权限时,段错误往往发生频率较低,因为操作系统从内存的某些部分读取的规则通常比写给它。对甚至另一个程序的内存的写访问通常受到保护,而如果地址本身超出有效的物理范围,则读访问可能只会导致段错误。