声明与0号元素仍然可以存储值的数组(Declaring an array with 0 number

2019-09-23 02:44发布

我得到的使用负指标只是纯粹的运气。 但是,出于好奇我尝试这样做。 我知道你可以声明数组[0]; 就像的malloc(0); 是合法的。 但是,我怎么就可以存储在阵列[0]的值?

#include <stdio.h>
#include <conio.h>
int main(void)
{
    int i;
    int array[0];
    array[0] = 5;
        printf("%d\n",array[0]);
    getch();
}

Answer 1:

这样的0大小的数组是违反约束标准C,你的编译器应该不会让你摆脱这种没有给你的诊断。 如果不告诉你的话,那一定是你的编译器供应商已经加入到其C方言的延伸。

不要依赖这些扩展。

不管您是否会声明数组大小为0 ,C具有数组或指针的访问没有强加边界检查。 良好的现代编译器应该还是给你一个警告,不过,如果超出界限在编译时是已知的。



Answer 2:

您正在访问的存储空间是未定义或别的东西使用。 直到您使用malloc,你根本不知道该阵列是否存在该代码将最终拧东西了,因为。 你创造了大小为零的数组。 C的温度将让你写你想要什么,无论你给它一个地址。 从干扰除非操作系统。 “阵列”是指向的数组,它有一些任意值。 编译器不知道该内存空间应该数组的第零元素,你正在使用它保留。



Answer 3:

Ç假设(它可以),你知道自己在做什么。 一个零长度阵列仍具有地址(但该地址可很容易地与别的尺寸的共享)。 当您索引到该数组,你只是修改您所使用的存储位置,没有什么其他人使用你最终地址关注 - 通过写,你可以很容易造成巨大的(和调试困难)问题。



Answer 4:

就像Vikdor在评论说,你是写在没有为您预留一个内存位置。 这可能会导致严重的和难以调试的问题,所以我建议你从来没有做到这一点,但是这是它如何工作的:

当声明大小为0的数组int array[0]的编译器将要与存储器位置的名称“数组”相关联。 比方说,100的这个例子。 但由于数组的大小为0,没有字节属于阵列,因此字节100,101等可能会被分配给其他变量太多。

当你说array[0] = 5你正在写的数目为5〜100字节,101,102和103,因为一个int是4个字节长。 然后可以读出,使用数数组[0],读取4个字节处开始的位置100。

当始于100的空间给其他一些变量,因为那可能会覆盖阵列出现的问题[0],仿佛数组[0]已经改变没有理由会出现(这是在那里你会花很多令人沮丧的时间调试)

请记住,int数组[0]就像INT *阵列。 数组的名称仅仅是一个指针。



Answer 5:

int array[0]; 

为InvalidÇcode.It被非符合标准的。 你的代码编译干净,因为它采用的是编译器特定的扩展

参考:
C99标准:6.7.5.2数组声明
第1段:

除了可选的类型限定符和关键字静态的,则[和]可限定表达式或* 。 如果它们限定的表达式(指定的数组的大小),则表达式应具有的整数类型。 如果表达式是一个常量表达式,它应具有的值大于零 。 元素类型不应是不完整或功能类型。 可选的类型限定符和关键字static应仅在与阵列类型的函数参数的声明仅在最外层阵列型推导出现,然后。


为什么似乎工作?

假设你的编译器实现允许零长度数组的:

array[0] = 5; 

仍然有效,因为这段代码语句导致未定义行为
其写入未被从而overwritting分配存储器的边界阵列拥有的存储器区域。 幸运的是,它的工作原理是因为内存可能不是由某个其他实体使用。 从技术上讲,它仍然是一个未定义的行为。



文章来源: Declaring an array with 0 number of elements can still store values