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
  int group[ group_num ];

  group[ 1202 ] = 233;

group_num <= 1202の場合、これを行うのは安全ではありません。アレイに割り当てられていないメモリにアクセスしているため、セグメンテーション違反が発生したり、さらに悪いことに、プログラムの他のデータがランダムに破損したりする可能性があります。

したがって、int []を使用する場合は、有効な範囲(つまり、サイズ未満)のインデックスにアクセスすることを確認する必要があります。std :: vectorは、ブラケットアクセス(例)を使用する場合、この点でまったく同じように動作しますが、無効なアクセスの場合に例外をスローするをgroup[0]使用することもできます。.at()

結局、何を使用するかは好みによって異なりますが、真実はstd::vectorの方がおそらくプログラマーにとって使いやすいでしょう。

于 2013-02-11T23:08:39.463 に答える
1

これは標準の C++ ではなく、「可変長配列」と呼ばれる C の拡張機能を使用しています。

要するに、気にしないでください。std::vector動的サイズの配列が必要な場合にのみ使用してください。

ここで正確に何が起こりますか?

すべての配列と同様に、インデックスが配列の境界内にある場合は正常に機能します。そうしないと、未定義の動作が発生します。これにはstd::vector.operator[]

于 2013-02-11T22:52:37.043 に答える
1

そのような配列は安全に使用できますか、それとも他の機能を使用することをお勧めしますか (私はベクトルを考えていました)。

C++ を使用する場合は、はい、使用する必要std::vectorあるデータ構造です。

ただし、C スタイルの配列を理解したい場合は、次のことを覚えておくT array[N];必要arrayがありNます。index でその要素にアクセスすることは、範囲外であるため、未定義の動作です。0N - 1N

于 2013-02-11T22:52:54.333 に答える
1

vectorこれは実際には C ではなく C++ であるため、を使用することをお勧めします。2 つの言語は別個のものであり、混同しないでください。

group_numユーザーが 1203 以上の値を入力すると想定するべきではありません。実際、入力エラーをチェックしないため、ユーザーが「A」と入力すると、重大な問題が発生します。

于 2013-02-11T22:53:19.757 に答える
1

std::vector生の C 配列の代わりに C++ STL を使用するだけです。#include <vector>次に、std::vectorの適切なコンストラクターを使用して、指定されたサイズのベクトルを作成します。

vector<int> group(group_num);

operator[]次に、生の C 配列と同様に、を使用して、特定のインデックスでベクター項目にアクセス (読み取りと変更) できます。

(ベクトル インデックスの境界チェックが必要std::vector::at()な場合は、ベクトル インデックスが境界外の場合に例外をスローするメソッドの使用を検討できます。)

于 2013-02-11T22:56:29.450 に答える
0

それはCまたはC ++です。C ++が最も軽い変換であると思います...

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

ただし、group_num には任意の PS が含まれる可能性があるため、この割り当てをキャッチする必要があります 。削除することを忘れないでください

于 2013-02-11T23:17:05.097 に答える