ローカルに割り当てられた配列へのポインターを返しています。スタックに割り当てられ、関数が戻ると消え、ポインターはガベージを指したままになります。
いくつかのオプションがあります。配列を渡して埋めることができます:
void DecimalToBinary(int result[10],int number){
while(number!=0){
result[n++] = number%2;
number/=2;
}
return result;
}
// usage example:
int b[10];
DecimalToBinary(b, 42);
または、ヒープに配列を割り当てることもできます。
int* DecimalToBinary(int number){
int *a = (int *)malloc(sizeof(int) * 10);
while(number!=0){
a[n++] = number%2;
number/=2;
}
return a;
}
// usage example
int *b = DecimalToBinary(42);
free(b); // when finished with it
または、配列を構造体でラップすることもできます。
typedef struct {
int b[10];
} result;
result DecimalToBinary(int number){
result r;
while(number!=0){
r.b[n++] = number%2;
number/=2;
}
return r;
}
// usage example
result r = DecimalToBinary(42);
malloc() オプションを実行する場合は、処理が完了したときに返されたデータを free() することを忘れないでください。そうしないと、ハングアップします。これをメモリリークと呼びます。より複雑なプログラムでは、深刻な問題につながる可能性があります。
注: ところで、数値が 1023 (2 進数の 10 桁) より大きい場合は、配列をオーバーランします。10 桁を格納したら明示的に停止するか、配列のサイズを渡すか、最初に必要なサイズを計算してその分のスペースを割り当てることもできます。また、数値が負の場合は奇妙な結果が得られます。number&1
代わりにを使用することをお勧めしますnumber%2
。
注 2: 他の場所で述べたように、n
ローカルにするか、関数が呼び出されるたびに少なくとも 0 に再初期化する必要があります。そうしないと、蓄積され、最終的に配列の末尾を超えてしまいます。