在c ++中进行数组初始化?

时间:2011-06-12 18:47:08

标签: c++

int main()
{
    clrscr();
    int x[3];
    int n;
    cout<<"Enter the array size= ";
    cin>>n;
    cout<<"Enter the elements for array= ";
    for(int i=0;i<n;i++)
    {
        cin>>x[i] ;
    }
    for(i=0;i<n;i++)
    {
        cout<<"x["<<i<<"]="<<x[i]<<"\n";
    }
    getch();
    return 0;
}

当我在c#中尝试相同的逻辑时,我得到了正确的输出,好像我输入的数组大于我初始化它给出了异常。但是在c ++中,在编译时和运行时都没有出现任何类型的错误。但是根据规则,如果我给出的数组大小超过初始化,那么它应该在输出的运行时给出一些错误。还有一点,为什么它将09确定为两个不单独为90的麻木,它在不同的指数和输出中显示0和9。

output

enter image description here

2 个答案:

答案 0 :(得分:4)

如果您有阵列:

char array[3];

你试图写入一个不存在的元素:

array[15] = '!';

然后此 错误。但是,C ++标准不要求编译器诊断此错误,大多数情况下不需要。这是因为每次访问数组时都需要计算 来确定你是否在数组范围内。

相反,由程序员确保他/她正确地使用数组,通过编写这些边界检查他或她自己。然后只在程序员认为有必要时执行检查,并且没有浪费的计算。

所以:

std::cin >> n;

if (n > 3)
   throw std::runtime_error("OMG not enough space in my array!");

答案 1 :(得分:0)

当你超量运行数组时,不需要C ++和反过来C来抛出异常。数组只是内存块,当你过度运行它们时,唯一一次遇到错误就是当你超出了操作系统运行时允许你作为内存中用户访问的界限时。例如,如果你超越你的数组,并为函数返回指针的值,然后当函数返回时,它会尝试在指令指针寄存器中放置一个虚假的返回地址,操作系统本身会抛出分段错误,因为您试图执行超出允许的内存地址的代码。分段错误和总线错误消息虽然是特定于操作系统的,但并不特定于C或C ++(即,组装时会出现相同的错误)。