【问题标题】:Are normal Arrays also dynamic? [duplicate]普通数组也是动态的吗? [复制]
【发布时间】:2015-03-15 20:54:11
【问题描述】:

以下是我的 C 代码

main(){

    int a[1];
    a[0]=10;
    a[1]=12;
    printf("%d\n",a[1]);
    copy_arr(a);
    printf("%d",a[1]);
}

以下是输出

12
12

它不应该让数组超出范围或类似的东西吗?

或者上面的代码是否依赖于编译器?

我在 gcc 编译器中运行上述代码。

【问题讨论】:

  • main() 应该是int main(void),并且您需要在顶部使用#include <stdio.h>copy_arr 定义在哪里?
  • 编译器应该给你一个警告,告诉你你的数组访问越界,而clang编译器确实警告你。不知道为什么 gcc 没有。
  • 使用 gcc,请务必使用 -Wall -Wextra 编译器标志启用警告。
  • @user3386109 编译器可以在这种特殊情况下解决它。但在大多数现实生活场景中,索引是基于一些运行时信息。

标签: c arrays


【解决方案1】:

C 中没有自动数组边界检查。您的代码有未定义的行为 (UB)。这意味着它有时似乎“有效”。但是你不能依赖任何特定的结果。带有 UB 的程序是一个损坏的程序。

【讨论】:

    【解决方案2】:

    访问越界内存是undefined behaviour。无论是静态分配还是动态分配。

    注意点:C 没有任何检查越界数组访问的内置功能。因此,默认情况下您不会收到警告 [正如您可能所期望的那样]。

    【讨论】:

      【解决方案3】:
      int a[1];
      

      这个数组只能保存一个整数,有效的访问是 a[0]a[1] 将是数组越界访问,这是未定义的行为。

      【讨论】:

      • @alk 我的意思是结果不一致,它有时可能有效,有时可能无效
      猜你喜欢
      • 2017-10-23
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多