C全局非大小数组?

1de*_*der 6 c arrays linked-list

我们有一个学校项目,任何使用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;
}
Run Code Online (Sandbox Code Playgroud)

与代码一样,他声明了一个未整理的数组,它是整个程序的全局(在bss段中).他能够通过用非零值的值覆盖后续的内存块来为数组添加新条目,这样他就可以遍历数组:

for (n=0; array[n]; n++) {
    /* do something */
}
Run Code Online (Sandbox Code Playgroud)

他用过(我也用它测试过)Turbo C v1.我在linux中尝试过它也可以.

由于我之前从未遇到过这种技术,我认为它存在问题.所以,是的,我想知道为什么这是一个坏主意,为什么更喜欢这个链接列表.

Alo*_*ave 6

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

技术上称为不完整类型数组.简单地说它相当于:

int array[1];
Run Code Online (Sandbox Code Playgroud)

这不好只是因为:

  1. 它会产生未定义的行为.不完整类型的数组的主要用途是在Struct Hack中.请注意,在C99中标准化的不完整数组类型以前它们是非法的.

  • 它不是VLA,它只是写入内存中的随机地址. (2认同)