問題が述べたように、これは実行可能です:
#include <iostream>
int main(int argc, char *argv[])
{
unsigned short int i;
std::cin >> i;
unsigned long long int k[i][i];
}
ここでは、i x i のサイズの配列を宣言しました。両方の次元は変数です。
しかし、これではありません:
#include <iostream>
int main(int argc, char *argv[])
{
unsigned short int i;
std::cin >> i;
unsigned long long int** k = new int[i][i];
delete[] k;
}
私はそれを伝えるコンパイラメッセージを受け取りました
エラー: 割り当てられた配列の最初の次元のみが動的サイズを持つことができます
私はこれを行うことを余儀なくされています:
#include <iostream>
int main(int argc, char *argv[])
{
unsigned short int i;
std::cin >> i;
unsigned long long int** k = new unsigned long long int*[i];
for ( unsigned short int idx = 0 ; idx < i ; ++ i )
k[idx] = new unsigned long long int[i];
for ( unsigned short int idx = 0 ; idx < i ; ++ i )
delete[] k[idx];
delete[] k;
}
私の理解では、 new と delete は、スタックではなくヒープに何かを割り当てるために使用されます。これは、スコープ外になったときに削除されず、関数やオブジェクト間でデータを渡すのに役立ちます。
私が理解していないk
のは、最初の例で宣言したときに何が起こるかということnew
です。delete
またはvector
s。
私が得ていないこれらの2つのソリューションには、長所と短所がありますか、それともそれが何であるかだけですか?
ところで、Apple の LLVM コンパイラを使用しています。