3

从我的代码中可能很明显,我对 C 语言真的很陌生。我正在开发一个通过 subprocess.PIPE / cin 从更大的 Python 程序调用的程序。我的意图是分配一个大小从 Python 定向的数组。现在我意识到我可以将一个整数分配给该数组的第 1202 个块,而与我传递给程序的数字无关。这里到底发生了什么?这样的数组可以安全使用还是建议使用其他功能(我在考虑向量)。

int main()
{
  string group_str;
  int group_num;
  getline (cin, group_str);
  stringstream( group_str ) >> group_num;
  cout << "Group number" << group_num <<"\n";

  int group[ group_num ];

  group[ 1202 ] = 233;

  for (int i=0; i < 1203 ; i++)
    {
      cout << group[i] << '\t' <<  i << endl;
    }

  return 0;
}
4

7 回答 7

4

这是未定义的行为,它可能导致您的程序执行任何操作。语言什么都不能保证。不要访问超出其边界的数组。

于 2013-02-11T22:52:26.203 回答
1

这不是标准的 C++,它使用了 C 的扩展,称为“可变长度数组”。

简而言之,不要打扰它。std::vector如果你想要一个动态大小的数组,就使用它。

这里到底发生了什么?

与每个数组一样,如果索引在数组的范围内,它就可以正常工作。如果没有,您将获得未定义的行为。这包括std::vector's operator[]

于 2013-02-11T22:52:37.043 回答
1

这样的数组可以安全使用还是建议使用其他功能(我在考虑向量)。

如果您使用 C++,那么是的,std::vector是您应该使用的数据结构。

但是,如果您想了解 C 风格的数组,那么您需要记住:T array[N];声明arrayN元素,索引从0to N - 1。在 index 处访问其元素是未定义的行为N,因为它超出了范围。

于 2013-02-11T22:52:54.333 回答
1

我建议使用 a vector,因为这实际上是 C++ 而不是 C。这两种语言是不同的,不要混淆。

您真的不应该假设用户将输入group_num1203 或更大的值。事实上,您不会检查任何输入错误,因此如果用户输入“A”,您将遇到严重问题。

于 2013-02-11T22:53:19.757 回答
1

我只是使用 C++ STLstd::vector而不是原始 C 数组。 #include <vector>然后使用std::vector正确的构造函数来创建一个指定大小的向量,例如

vector<int> group(group_num);

然后,您可以使用 访问(读取和修改)给定索引处的向量项operator[],就像使用原始 C 数组一样。

(如果您想对向量索引进行边界检查,您可以考虑使用std::vector::at()方法,如果向量索引超出范围,则会引发异常。)

于 2013-02-11T22:56:29.450 回答
1
  int group[ group_num ];

  group[ 1202 ] = 233;

如果 group_num <= 1202,这样做是不安全的。您正在访问未分配给数组的内存,这可能会导致段错误或更糟,随机损坏程序的其他数据。

因此,如果您使用 int[],您应该检查您访问的索引是否在有效范围内(即小于大小)。如果您使用方括号访问(例如 ),则 std::vector 在这方面的行为完全相同,group[0]但您也可以使用.at()which 在无效访问的情况下引发异常。

最后,这取决于您的口味使用什么,但事实是 st​​d::vector 可能对程序员更友好。

于 2013-02-11T23:08:39.463 回答
0

是 C 还是 C++ 我假设 C++ 最轻的转换将是......

--int group[ group_num ];
++int group* =new int[ group_num ];

但是您应该尝试捕获此分配,因为 group_num 可能包含任何 PS。不要忘记删除

于 2013-02-11T23:17:05.097 回答