【问题标题】:Are C arrays dynamic? [duplicate]C数组是动态的吗? [复制]
【发布时间】:2017-10-23 17:08:30
【问题描述】:

据我了解,C 数组不能动态增长。但是为什么 index=5 & 6 在下面起作用呢?

char carray[5];
carray[0] = 'a';
printf("carray[0]=%c\n", carray[0]);
carray[5] = 'b';
printf("carray[5]=%c\n", carray[5]);
carray[6] = 'c';
printf("carray[6]=%c\n", carray[6]);

输出:

char_array[0]=a
char_array[5]=b
char_array[6]=c

【问题讨论】:

  • “还有,为什么不赋值”,什么意思?
  • 未定义行为,C 中没有边界检查

标签: c arrays


【解决方案1】:

你得到这个结果是因为它是内存垃圾,它不是你的。

也许这会有所帮助C Undefined Behavior

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

【讨论】:

  • 数组不是指针!问题是关于 C,而不是 C++!
  • 对不起,要编辑我的答案。是的,但是 C++ for UB 的文档也适用于 C。
  • 另外需要指出的是,超出分配内存的访问可能会损坏其他变量或代码,甚至由于未映射的内存访问而导致程序崩溃
  • 链接到C未定义行为站点不合适吗?我指的是这个:en.cppreference.com/w/c/language/behavior
  • 谢谢 Erik 和 Gustavo。
【解决方案2】:

C 中没有任何东西可以阻止您在数组范围之外进行读取或写入。元素 5 和 6 所在的数组之后的内存可能是另一个变量或函数,或者谁知道是什么,并且通过为该内存分配新值,您可能会导致程序崩溃。或者它可能只是工作。您无法知道结果是什么,因为您会导致未定义的行为。

最好充分了解数组或分配内存块的大小,并且永远不要超出它们!

【讨论】:

    【解决方案3】:

    正如其他答案中所解释的,仅仅因为您没有看到任何不利影响并不意味着它们不存在。这是一个示例,可帮助您了解超出数组可能导致的损坏类型。 (我在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 ZJK

    数组 a3 的字母 I 已被 Z

    覆盖

    溢出的数组 a2 实际上损坏了 a3

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

    【讨论】:

      猜你喜欢
      • 2015-03-15
      • 2021-07-22
      • 2011-07-08
      • 2014-02-10
      • 2022-01-02
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多