【发布时间】:2013-02-25 01:29:16
【问题描述】:
我们有一个学校项目,任何使用 C 的信息系统。为了保持学生记录的动态大小列表,我选择了链表数据结构。今天早上我的朋友让我看看他的系统。我对他的记录列表感到惊讶:
#include <stdio.h>
/* and the rest of the includes */
/* global unsized array */
int array[];
int main()
{
int n;
for (n=0; n < 5; n ++) {
array[n] = n;
}
for (n=0; n < 5; n ++) {
printf("array[%d] = %d\n", n, array[n]);
}
return 0;
}
与代码一样,他声明了一个对整个程序来说是全局(在 bss 段中)的未调整大小的数组。他能够通过用非零值覆盖后续内存块来向数组添加新条目,这样他就可以遍历数组:
for (n=0; array[n]; n++) {
/* do something */
}
他使用(我也测试过)Turbo C v1。我在 linux 中尝试过,它也可以工作。
由于我以前从未遇到过这种技术,我推测它存在问题。所以,是的,我想知道为什么这是一个坏主意,以及为什么比链表更喜欢它。
【问题讨论】:
-
这与写入任何越界数组相同 - 未定义。
-
这应该是 c99 吗?
-
1der 请检查 teppic 的更新答案。并打开键盘链接,您可以在代码中观察 C 的未定义行为。
标签: c arrays linked-list