0

このプログラムを実行しようとしていますが、失敗しています。どこが間違っているのかわかりません。セグメンテーション違反が発生します。おそらく、ポインターが機能しないことが原因でエラーが発生したのでしょう。

#include <stdio.h>
#include <stdlib.h>

void ConvertBin(int n, int *ris,int *bit);

int main(int argc, char *argv[]) 
{
    int n;
    int ris[20];
    int bit;

    printf("Insert num: "); scanf("%d", &n);

    ConvertBin(n,ris,&bit);

    for (int i=bit; i!=0; i--) 
    {
        printf("%d", *(ris+i));
    }   

    return 0;
}

void ConvertBin(int n, int *ris, int *bit)
{
    int i = 0;

    while (n!=0)
    {
        *(ris+i) = n%2;
        n = n/2;
        i++;
    }

    bit = &i;
}
4

2 に答える 2

2

エラーは関数の最後の行にあります。ローカル変数のアドレスにbit = &i;設定します(変数は関数から戻ると存在しなくなります)。その後、値 ofは使用されません。実際、関数の最後の行はまったく効果がありません。また、呼び出し元の関数 ( ) は、その変数の更新された値を受け取りません。bitibitmainbit

*bit = i;代わりに書き込む必要があります。これにより、 by (の場合は's )iへの変数ポインターに値が書き込まれます。bitmainbit

于 2013-11-09T21:40:58.870 に答える
-1

問題は、変数 i にあります。これは、本来よりも 1 ポイント大きかったのです。これはうまくいくはずです:

#include <stdio.h>
#include <stdlib.h>

void ConvertBin(int n, int *ris,int *bit);

int main(int argc, char *argv[]) 
{
    int n;
    int ris[20];
    int bit;

    printf("Insert num: "); scanf("%d", &n);

    ConvertBin(n,ris,&bit);

    for (int i=bit; i>=0; i--) 
    {
        printf("%d", *(ris+i));
    }   

    return 0;
}

void ConvertBin(int n, int *ris, int *bit)
{
    int i = 0;

    if( !n ){
        *(ris) = 0;
        i++;
    } else{
        i = 0;
        do
        {
            *(ris+i) = n%2;
            n = n/2;
            i++;
        } while (n!=0);
    }
    *bit = i -1;
}
于 2013-11-09T22:22:52.767 に答える