このような小さなスペースで多くの問題があります。
まずインターフェイスについて考えてみましょう。呼び出し元のコードは返される値の数をどのように知っていますか?おそらく、ポインタの配列の終わりにヌルポインタがなければなりません。また、1より大きい各数値については、1であり、数値自体が除数であることがわかっているので、少なくとも3つのポインタの配列が返される必要があります。数値が素数でも1でもない場合、配列にプッシュする値が増えます。したがって、私たちがやる必要のあることの1つは、配列内の値の数を把握することです。また、メモリ解放コードは、配列全体を解放する前に各文字列を解放して、返された配列をステップ実行する必要があります。
だから、コードが何をすべきかについていくつかのアイディアを得る。あなたのコードはこれに対してどのように対価を取るのですか?
char** calc_div(char nr[100])
{
int nri,i,ct=0;
char **a = (char**)malloc(sizeof(char*));
これは、戻り配列に1つのエントリを割り当てます。私たちは現在、少なくとも3倍のスペースが必要であることを知っており、スペースの割り当て量を記録しなければなりません。
nri = atoi(nr);
for(i=0;i<sizeof(char*);i++)
a[i] = (char*)malloc(sizeof(char));
これは、以前に割り当てられたサイズ1の配列の連続する要素に割り当てる、大きさ1バイト毎の4つのまたは8文字列を割り当てます。これは、配列a
のバッファオーバーフローを保証しています。さらに、文字列は文字列の最後にヌルを保持するだけの大きさなので、そこに答えを入れることはできません。 nr
は必要な番号の1つで、おそらくstrlen(nr)+1
バイトを割り当てる必要があります。数値が3つまたは7つの要素に制限されていることは遠隔から明らかではありません(終了ポインタも考慮する必要があるため)。
for(i=1;i<=nri;i++)
if(nri % i == 0)
{
sprintf(a[ct++],"%d",i);
}
if
文の本体内のコードは、新たな要因のために、アレイとし、必要な時のためのメモリ割り当てを行う準備ができなければならないだろう。 1つのポインタがcharにため
char **a = (char**)malloc(sizeof(char*));
a
後
return a;
}
メモリ割り当ては私には意味がありません。私はそれがまったく働いていると驚いています。 – harold
1) 'sizeof(char)== 1 'から2)' malloc'の結果をキャストしないで、明示的にスペルする必要はありません。 –
デバッガを使用するか、printfステートメントを追加して進行状況を追跡することで、どこに行き詰まっているのかを知ることができます。 –