访问动态分配数组的越界元素/无 SegFault

THV*_*THV 1 c memory-management dynamic-memory-allocation

我正在用 C 语言开发一个程序,它使用链表数组(原始哈希表)作为数据类型来表示某些日期信息。该数组有十二个元素对应于一年中的几个月,每个月都有一个包含数据节点的链表。

我开发了使用这种数据类型的模块,它运行良好。后来我发现我正在访问越界的数组元素(例如通过索引 12 而不是 11 访问第 12 个元素)。但该程序始终如一地运行,没有发生任何事故。我从未收到过分段错误。我已经纠正了编码错误。有人能解释为什么访问越界元素不会导致段错误吗?

这已经不是第一次发生了。我创建了一个动态分配的多维数组,为了测试,我尝试访问越界元素。该程序运行良好,产生了准确的结果,并且在大多数情况下不会出现段错误。我唯一一次实现了,我不得不尝试访问实质上越界的元素。

(这些程序目前是用于测试的 Windows 控制台应用程序。我正在使用 MinGW 进行编译。如果有帮助,我可以包含代码。)

Kei*_*son 5

在 C 中,访问超出其边界的数组是未定义的行为

这意味着任何事情都可能发生,包括程序的行为可能符合您的预期。

C 语言不需要对数组访问进行边界检查,并且大多数 C 编译器没有实现它。

例如,假设您声明:

int before;
int array[10];
int after;
Run Code Online (Sandbox Code Playgroud)

它们在内存中的存储顺序是不确定的,但假设它们按照声明的顺序连续存储。如果您尝试访问array[-1],您可能会before改为访问。如果您尝试访问array[10],您可能会访问after改为。

避免访问超出范围的数组是程序员的负担。或者在您的数组之前和/或之后可能没有分配任何内容。

打个比方:“路牌上写着绿灯时我才可以过马路。我是红灯过马路,什么也没发生。为什么没有车撞我?” (有些语言会竭尽全力汽车撞到你。C 不是其中之一。)