C / C ++数组 - 我使用了什么类型的赋值?

时间:2013-02-11 22:49:10

标签: c++ arrays cin

从我的代码中可能很明显,我对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;
}

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

简而言之,不要理会它。如果你想要一个动态大小的数组,只需使用std::vector

  

这里到底发生了什么?

与每个数组一样,如果索引在数组的范围内,它可以正常工作。如果没有,您将得到未定义的行为。这包括std::vector的{​​{1}}。

答案 2 :(得分:1)

  

这样的数组是否可以安全使用,或者建议使用其他功能(我在想矢量)。

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

如果你想了解C风格的数组,那么你需要记住:T array[N];声明arrayN个元素,从0索引到{ {1}}。在索引N - 1访问其元素是未定义的行为,因为它超出了界限。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

vector<int> group(group_num);

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

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

答案 5 :(得分:1)

  int group[ group_num ];

  group[ 1202 ] = 233;

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

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

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

答案 6 :(得分:0)

是C或C ++我假设是C ++ 最轻微的转变将是......

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

但是你应该尝试捕获这个分配,因为group_num可以包含任何 PS。别忘了删除