THV*_*THV 1 c memory-management dynamic-memory-allocation
我正在用 C 语言开发一个程序,它使用链表数组(原始哈希表)作为数据类型来表示某些日期信息。该数组有十二个元素对应于一年中的几个月,每个月都有一个包含数据节点的链表。
我开发了使用这种数据类型的模块,它运行良好。后来我发现我正在访问越界的数组元素(例如通过索引 12 而不是 11 访问第 12 个元素)。但该程序始终如一地运行,没有发生任何事故。我从未收到过分段错误。我已经纠正了编码错误。有人能解释为什么访问越界元素不会导致段错误吗?
这已经不是第一次发生了。我创建了一个动态分配的多维数组,为了测试,我尝试访问越界元素。该程序运行良好,产生了准确的结果,并且在大多数情况下不会出现段错误。我唯一一次实现了,我不得不尝试访问实质上越界的元素。
(这些程序目前是用于测试的 Windows 控制台应用程序。我正在使用 MinGW 进行编译。如果有帮助,我可以包含代码。)
在 C 中,访问超出其边界的数组是未定义的行为。
这意味着任何事情都可能发生,包括程序的行为可能符合您的预期。
C 语言不需要对数组访问进行边界检查,并且大多数 C 编译器没有实现它。
例如,假设您声明:
int before;
int array[10];
int after;
Run Code Online (Sandbox Code Playgroud)
它们在内存中的存储顺序是不确定的,但假设它们按照声明的顺序连续存储。如果您尝试访问array[-1],您可能会before改为访问。如果您尝试访问array[10],您可能会访问after改为。
避免访问超出范围的数组是程序员的负担。或者在您的数组之前和/或之后可能没有分配任何内容。
打个比方:“路牌上写着绿灯时我才可以过马路。我是红灯过马路,什么也没发生。为什么没有车撞我?” (有些语言会竭尽全力让汽车撞到你。C 不是其中之一。)