gpt4 book ai didi

c - 未初始化的 2d 指针的取消引用和地址运算符行为

转载 作者:行者123 更新时间:2023-11-30 20:38:13 26 4
gpt4 key购买 nike

我不太明白这个说法:

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

事实上,我无法解释为什么我在运行时没有出现段错误,因为它不应该能够使用带有数字的 * 操作数,而该数字应该是返回值*(ptr + 1)

最佳答案

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

在运行时,您的代码正在执行的操作是调用未定义的行为。正如其他人在评论中提到的,未定义的行为并不意味着崩溃。事实上,有时崩溃是在这种情况下可能发生的最理想的行为,因为调试器可以立即向您提供有关出错原因的信息。在不太理想的情况下,该程序可能看起来运行良好,除非偶尔在满月出现时,行为会发生不稳定的变化。它可能因编译器不同、build设置不同、平台不同而不同,因此您确实希望尽可能避免它们。

实际上,当您尝试访问指针进行读访问时,段错误的发生频率往往比写访问要低,因为操作系统从某些内存部分读取的规则通常比写入内存的规则更宽松。即使对另一个程序的内存的写访问通常也会受到保护,而如果地址本身超出有效的物理范围,则读访问可能只会导致段错误。

关于c - 未初始化的 2d 指针的取消引用和地址运算符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30156874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com