【问题标题】:Parametrical size of an array in C++ [duplicate]C ++中数组的参数大小[重复]
【发布时间】:2015-08-16 00:58:30
【问题描述】:

请不要粗暴评价我,我只是C++编码的新手 但是我的问题是下一个:为什么我们不能声明一个具有参数大小的数组,我们自己输入其中的参数?例如:

int mas[i*];
cin>>i*;

?

【问题讨论】:

  • 您是否打算按此顺序输入这些说明?
  • 不,我不打算按那个顺序输入这些指令!
  • 但是我认为最好有一个编译器来通知计算机 i* 是我们自己输入的数组大小实际含义的形式参数!
  • 对不起,我打算按这个顺序输入这些指令。否则它将是一个 VLA 数组。

标签: c++ arrays


【解决方案1】:

你可以这样做:

int i;
if ( !(std::cin >> i) )
    throw std::runtime_error("input failed");

std::vector<int> mas(i);

请注意vector 是用 C++ 编写运行时大小的数组的方式。 C 风格的数组主要是为了历史兼容性而存在的,应该避免使用。

【讨论】:

    【解决方案2】:

    在 C++ 中,数组是一个对象,其类型为 数组类型,所有变量和所有表达式的类型都是(静态)程序的一部分,并且必须在编译时知道.换句话说,mas 的类型必须在编译时知道。

    在编译时创建类型未知的对象的唯一方法是使用数组新表达式new T[n],但即使在这种情况下也没有 类型:您可以从该表达式中恢复的唯一值是 T * 类型的值,其中包含数组对象的第一个元素子对象的地址。

    【讨论】:

      【解决方案3】:

      因为当您创建一个数组时,程序需要为其元素分配足够的内存。在您的示例中,在声明数组时,数组中的元素数量仍然未知。

      【讨论】:

      • 是的,但是为什么人们不能改进编译器以在输入形式参数 i* 的实际含义后保留内存?在我们的例子中只需将 i* 的实际含义乘以 4 ,因为数组的类型是int。
      • @Dmitrii 因为 C++ 不能那样工作。做你想做的事需要额外的基础设施,这是该语言从未设计过的。当然,人们可以尝试添加这样的东西。但到那时,生成的语言将不再是标准的 C++。 (当然还有一个问题,这个提议的特性的好处是否值得付出努力来实现它。)
      • 在这种情况下,编译器必须为从 0 到 EOF-1 的元素分配内存。
      • 在 cin>>i* 运算符之后的更多内容,编译器必须首先检查是否还有其他 cin>>i* 运算符,如果有,它仍会为 0-EOF-1 保留内存元素,直到它到达最后一个运算符 cin>>i* 之后它必须比较所有输入的 i* 并为 (max i*)+1 分配内存并释放其他保留的内存用于其他目的!
      • 这仅用于使用一个数组,但如果只有一个 cin>>i* 运算符,编译器将为 (0-i *+1) 元素。
      猜你喜欢
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2021-08-05
      相关资源
      最近更新 更多