据我所知,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
答案 0 :(得分:5)
C中没有任何内容可以阻止您读取或写入超出数组范围的内容。你的数组后面的内存元素5&amp; 6 live可能是另一个变量或函数或者谁知道什么,并通过为该内存分配新值,可能会导致程序崩溃。或者它可能只是工作。你无法知道结果是什么,因为你造成了未定义的行为。
最好完全了解分配内存的大数组或大块是多少,并且不要超越它们!
答案 1 :(得分:1)
答案 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