私はまだ別の答えを追加することをお詫びしますが、私は誰もあなたの質問でカバーする必要があるすべてのポイントをカバーしていないと思います。
1)malloc()
を使用してメモリを動的に割り当てるときは、いつでも終了したらfree()
にする必要があります。オペレーティングシステムは、通常、あなたの後にきちんと整理されますが、いくつかのメモリを使用する実行可能ファイルの中にプロセスがあることを考慮してください。上記のプロセスが完了すると、そのメモリがfree()
の場合、プロセスに使用可能なメモリが増えます。それは効率性についてです。
int* somememory = malloc(sizeyouwant * sizeof(int));
// do something
free(somememory);
簡単:無料正しくを使用するには
。
2)malloc
を使用するたびに、実際の割り当てはバイト単位であるため、malloc(numofelements*sizeof(type));
を実行する必要があります。あまり広く使われていないcalloc
という機能があり、これはおそらく理解しやすいcalloc(num, sizeof(type));
のようなものです。 callocもメモリを0に初期化します。
3)あなたはmalloc
の戻り値の型をキャストする必要はありません。私はプログラミングの本がたくさんあることを示唆しています.C++では必須であることを義務づけています(ただし、C++ではnew
/delete
を使用する必要があります)。 this questionを参照してください。
4)あなたの関数のシグネチャは確かに間違っていた - 関数のシグネチャは、その機能と一致する必要があります。
5)関数からポインタを返すには、それは私が落胆ものですが、それはそれ自体は間違っていないです。言及する2つのポイント:常に1)を念頭に置いてください。私はaskedとまったく同じ問題を抱えており、基本的にはこれらの呼び出しを追跡することになります。より高度なユーザーとして、気にするアロケータタイプもあります。
ここでもう一つのポイントは、この関数を考えてみます。
int* badfunction()
{
int x = 42;
int *y = &x;
return y;
}
これは悪い、悪い、悪いです。ここでは、badfunction
の場合に限り、x
へのポインタを作成して返します。戻り時に、が存在しなくなる変数へのアドレスがあります。通常、スタックにはx
が作成されるためです。時間の経過とともにそれについてもっと学びます。今のところ、変数がその機能を超えて存在しないと思うだけです。
int* y = malloc(...
は、mallocのためにメモリがヒープ上に作成され、したがってその関数の終わりに耐えないことに注意してください。
私は関数のシグネチャとして何を勧めますか?私の変更は単なる個人的な好みです
int findFactors(int* factors, const int N);
:私は実際にはわずかな修正でshybovychaの機能となるだろう。私はconst
を使用するので、何かが関数の入力の一部であることがわかります。厳密にはintでは必要ではありませんが、ポインタを渡している場合は、先にconst
を使用しない限り、ソースメモリを変更できることを覚えておいてください。だから、この場合はちょうど習慣です。
第二の変化は、私はいつもそのように周りだと思うので、私はすなわちoutput = func(input)
、左側の出力パラメータを好むということです。
ポインタを使用する場合は、なぜあなたは、関数の引数を変更することができますか?変数へのポインタを渡したからです。これはちょうどメモリアドレスです - 私たちがそれを "逆参照"すると(そのアドレスの値にアクセスする)、それを変更することができます。技術的に言えば、Cは厳密に値渡しです。ポインタはそれ自身がメモリアドレスを含む変数であり、これらの変数の内容は関数にコピーされます。したがって、通常の変数(たとえばint
)は、渡されたもののコピーに過ぎません。int* factors
は、渡したポインタ変数のアドレスのコピーです。設計上、元のコピーとこのコピーが同じメモリを指しているので、参照を外すと、呼び出し元と元の関数の両方でそのメモリを編集できます。
私はいくつかをクリアすることを願っています。
それを実演しました。 int **そしてint ** numberOfFactors – JoeS88