阵列中的疑惑并重新定义它的大小

时间:2013-11-22 07:29:12

标签: c arrays

我只是在c中尝试数组。其中我有以下基本疑虑?

#include <stdio.h>

int main()
{
    int a[5]={1,2,3,4,5};
    a[45]=28; // trying to access the random array element which is out of bound 
    printf("\n value at a[5] is %d",a[5]);
    printf("\nvalue at a[45] is %d",a[45]);
    printf("\nvalue at a[78] is %d",a[78];
    return 0;
}

上述程序成功编译并产生以下输出。

value at a[5] is 1234355   // some ando address
value at a[45] is 28       // which i have assigned
value at a[78] is 0

我的问题是

i)当我访问数组元素超出绑定.whys时它没有产生任何错误?

ii)对于char数组,例如:char[10]= {'1','2','3','4','5','6','7','8','9','0'};数组的最后一个元素将由编译器添加'\ 0'。是否与整数数组相同?如果不是为什么?

iii)是否可以重新定义阵列?

1 个答案:

答案 0 :(得分:2)

这些不是“疑惑”,而是问题。

  1. 因为C没有边界检查。它会让你做你想做的事,几乎。此代码是未定义的行为,任何事情都可能发生。它“有效”只是运气。
  2. 不,它只适用于字符串,如果文字的长度与您的情况完全匹配,则不会发生。如果您执行char foo[] = "abc";,那么foo[3]将添加为'\0',但如果您执行char foo[3] = "foo";,那么foo[3]是无效访问,因为数组只有三个值。最后一个值为foo[2]'o',您的初始值设定项被编译器覆盖,因此在这种情况下foo 不是一个有效的字符串。
  3. 不确定“重新定义”是什么意思,但是你不能在C中重新定义任何变量,至少不在同一范围内。你可以用一个新的范围“别名”它们,但这很丑陋,并且在实践中不会给你带来太多的好处。