これらの2行は私にセグメンテーション違反を与えており、私はそれを理解できません:
int** input;
*input = (int*)calloc(5, sizeof(int));
それでおしまい。私がこれを理解する方法は、5 intsに等しいメモリを要求し、メモリアドレスを返すことです。入力が指す値にメモリアドレスを格納します。私は何が欠けていますか?
これらの2行は私にセグメンテーション違反を与えており、私はそれを理解できません:
int** input;
*input = (int*)calloc(5, sizeof(int));
それでおしまい。私がこれを理解する方法は、5 intsに等しいメモリを要求し、メモリアドレスを返すことです。入力が指す値にメモリアドレスを格納します。私は何が欠けていますか?
あなたは決して初期化input
しないので、そこにあるものは何でも参照します、多分これはあなたが望むものです
int** input;
input = malloc(sizeof(int*));
*input = calloc(5, sizeof(int));
問題は、まだ割り当てられていないアドレスに割り当てようとしていることです。値を入力に直接割り当てると、機能するはずです。
input = (int *) calloc(5, sizeof(int));
編集:キャストを更新するのを忘れたので、もう少し説明が必要だと思いました。
割り当ては次のようになっているはずです。
input = calloc(5, sizeof(int *));
これは、5つの整数ポインターの配列を割り当てることです。それができたら、整数の配列を割り当てて、それらの整数ポインター内に格納できます。(注:ここではC99サポートを想定しています。
for (int i = 0; i < 5; i++) {
input[i] = calloc(5, sizeof(int));
}
これは、整数の5行5列の行列を割り当てることであり、基本的に次のように入力を宣言するのと同じです。
int input[5][5];
違いは、この宣言では、コンパイラが割り当てを管理することです。これは、必要な場合とそうでない場合があります。たとえば、このコードが関数内にあり、割り当てたマトリックスへのポインタを返したい場合は、自分でメモリを割り当てたいと思うでしょう。現在の関数内でデータ構造のみを使用している場合は、コンパイラにメモリを管理させることで問題なく機能します。