1

studio.h ライブラリのみを使用して、配列を使用して剰余を格納し、10 進数から 2 進数に変換したいのですが、結果が正しくありません。メモリ割り当てに問題があるか、戻り値が間違っている可能性があります。確認してください。 . どうもありがとう!

#include <stdio.h>
int  n = 0;
int* DecimalToBinary(int number){
    int a[10];      
    while(number!=0){
        a[n++] = number%2;
        number/=2;
    }
    return a;
}

void main(){

    int *d1 = DecimalToBinary(5);
    int *d2 = DecimalToBinary(10);

    for(int i = n-1 ;i>=0;i--)
        printf(" %d",d1[i]);

    printf("\n");

    for(int i = n-1 ;i>=0;i--)
        printf(" %d",d2[i]);

}
4

6 に答える 6

3

ローカルに割り当てられた配列へのポインターを返しています。スタックに割り当てられ、関数が戻ると消え、ポインターはガベージを指したままになります。

いくつかのオプションがあります。配列を渡して埋めることができます:

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 に再初期化する必要があります。そうしないと、蓄積され、最終的に配列の末尾を超えてしまいます。

于 2013-08-06T07:37:53.263 に答える
0

あなたのコードの問題はここにあります..

int * DecimalToBinary(int number){
int a[10];      
while(number!=0){
    a[n++] = number%2;
    number/=2;
}
return a;

}

配列のスコープはこの関数までです。この関数が終了すると、この配列に割り当てられたメモリが解放されます。動的メモリ割り当てを使用するか、配列をグローバルにする必要があります。

于 2013-08-06T07:58:13.370 に答える
0

あなたができることとCで一般的に行われていることは、配列が呼び出された場所に配列を作成し、その配列へのポインタを関数に提供することです.関数セルフ。関数はポインタが指している要素の数を認識できないため、その関数に配列のサイズも指定する必要があります。

void DecimalToBinary( int number, int* output, unsigned size ) {
    /*adapt this to your liking*/
    int i;
    for ( i = 0; i < size && number != 0; i++) {
        output[i] = number%2;
        number/2;
    }
}

メイン関数では、次のように呼び出します。

int array[10];
DecimalToBinary( 5, array, sizeof(array)/sizeof(array[0]));

これで、配列はあなたの例と同じ結果にaなります。

于 2013-08-06T07:53:56.350 に答える
-1

これは正しいプログラムです:

#include <stdio.h>
int  n = 0;
int a[10] = {0};
int* DecimalToBinary(int number){
    n = 0;     
    while(number!=0){
        a[n++] = number%2;
        number = number/2;
    }
    return a;
}

int main(){

    int *d1;
    int *d2;
    int i;
    d1 = DecimalToBinary(5);
    for(i = n-1;i>=0;i--)
        printf(" %d",d1[i]);
    printf("\n");
    d2 = DecimalToBinary(10);
    for(i = n-1;i>=0;i--)
        printf(" %d",d2[i]);
    printf("\n");
}
于 2013-08-06T08:02:44.250 に答える