C阵列是动态的吗?

时间:2017-05-23 16:11:39

标签: c arrays

据我所知,C阵列无法动态增长。但为什么指数= 5& 6下面的工作?

let operators expr i =
    let f (s: CharStream<_>) = if i <= s.Column then expr s else pzero s
    opp.TermParser <- f
    f opp.ExpressionParser

输出:

  

CHAR_ARRAY [0] =一个
  CHAR_ARRAY [5] = B
  CHAR_ARRAY [6] = C

3 个答案:

答案 0 :(得分:5)

C中没有任何内容可以阻止您读取或写入超出数组范围的内容。你的数组后面的内存元素5&amp; 6 live可能是另一个变量或函数或者谁知道什么,并通过为该内存分配新值,可能会导致程序崩溃。或者它可能只是工作。你无法知道结果是什么,因为你造成了未定义的行为。

最好完全了解分配内存的大数组或大块是多少,并且不要超越它们!

答案 1 :(得分:1)

你得到的结果是因为它是记忆垃圾,不是你的。

也许这会有助C Undefined Behavior

最好指出尝试访问它可能导致分段错误,或导致安全问题(缓冲区溢出)

答案 2 :(得分:1)

正如其他答案中所解释的那样,仅仅因为您没有看到任何不利影响并不意味着它们不存在。这是一个帮助查看超出阵列的损坏类型的示例。 (我在https://www.codechef.com/ide

在线播放
#include <stdio.h>

int main(void) {
    char a1[4]={'A','B','C',0};
    char a2[4]={'E','F','G',0};
    char a3[4]={'I','J','K',0};
    a2[4]='Z';
    printf("%s %s %s\n", a1, a2, a3);
    return 0;
}

该程序的输出为ABC EFG Z JK

数组a3的字母 I 已被 Z

覆盖

超越阵列a2实际上损坏了a3

注意:根据环境的不同,覆盖可能会在其他地方发生,或者会导致程序崩溃。例如,在https://www.tutorialspoint.com/compile_c_online.php运行相同的代码会导致 Z BC EFG IJK