繁体   English   中英

C全局非大小数组?

[英]C global unsized array?

我们有一个学校项目,任何使用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中尝试过它也可以。

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

int array[];

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

int array[1];

这不好只是因为:

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

这是未定义的行为 您正在写入未分配的内存(超出阵列)。 为了编译它,编译器至少分配了一个元素,然后你就开始编写了这个元素。 尝试更大范围的数字。 例如,如果我在Linux上运行您的代码它可以工作,但如果我将循环更改为50,000,它会崩溃。

编辑代码可能适用于n小值,但对于较大的值,它将失败。 为了证明这一点,我编写了代码并测试了n = 1000

这是CODEPAD的链接,您可以看到,对于n = 1000,会发生分段错误

虽然使用相同的编译器使用相同的代码,但它适用于n = 10,请参阅此链接CODEPAD 所以这称为未定义行为

如果使用链接列表,则可以检查内存是否正确分配。

int *ptr;
ptr = (int *)malloc(sizeof(int))
if(ptr==NULL)
{
  printf("No Memory!!!");
}

但是使用你的代码,如果使用具有大边界的数组进行测试,程序就会崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM