c - 数组中的疑问并重新定义其大小

标签 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) 当我越界访问数组元素时。为什么它没有产生任何错误?

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

iii) 是否可以重新定义数组?

最佳答案

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

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

关于c - 数组中的疑问并重新定义其大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20139388/

相关文章:

C程序无法编译

python - 我如何在Python中将这个字符串变成2个数组?

c - 使用数组作为结构的元素初始化结构数组

c - fscanf 两行数据,执行计算,打印结果,fscanf 接下来的两行,在一个循环中?

在 C 中将 'BigStruct' 转换为 'SmallStruct'(具有不同大小的静态数组的类似结构)

javascript - Javascript 中基本原型(prototype)设计的问题

c - 如何使用程序实现加载器?

c++ - 没有退出的 exit() 的副作用?

c - 今天和 20 年前的内存对齐

c - C中的数组数据类型