0
#include <stdio.h>
#include <string.h>

int * bin(char a);

int main(void){
        char a='a';
        int k=0;
        int *binary;

        binary=bin(a);
        for(k=0; k<8; k++){
                printf("%d", *binary++); 
                printf("\n");      
        }

        return 0;
}
int *bin(char a){

        int i=0;
        int *arr;
        int output[8];
        char c=a;
        for (i = 0; i <8 ; ++i) {
                 output[8-i-1] = (a >> i) & 1;

        }
        arr=&output[0];
//              for (i = 0; i <8 ; ++i) {
//              printf("%d", output[i]);
//      }
//      printf("\n");

        return arr;
}

出力は、文字「a」のバイナリ値である必要があります: 0 1 1 0 0 0 0 1

しかし、私は代わりにこれを得ました: 0 -1216804320 -1218095335 -1216804320 10 -1076423592 -1218208721 -1216804320

これはポインタの問題ですか?正しい答えを出力するように修正するにはどうすればよいですか? どうも!!

4

2 に答える 2

4

ローカル変数 ( ) へのポインターを返していますがarr、その内容は関数が戻るときに無効になっています。malloc代わりに使用してください:

int main(void){
        ...
        int *arr = bin(a);
        ...
        free(arr);
        return 0;
}

int *bin(char a){
        int *arr = malloc(8 * sizeof int);
        ...
        return arr;
}
于 2013-03-18T18:58:22.013 に答える
1

私が気づくことができる最初のエラーは、スコープの問題です。ローカル変数のアドレスを返しているということです output[8];

 arr=&output[0];
 return arr;

それは間違っています。スコープは関数output[]bin()のみです。

次のように、関数の外部にアクセスする場合は、メモリを動的に割り当てる必要があります。output[] bin()

int *output = calloc(8, sizeof(int));

return outputbin() からの追加の変数は必要ありません

あまり変更せずに、以下のようにコードを修正しました。

int *bin(char a){
        int i=0;
        int *output = calloc(8, sizeof(int));
        for (i = 0; i <8 ; ++i) {
                 output[8-i-1] = (a >> i) & 1;
        }
        return output;
}

未使用の変数が削除されたことcに注意してください。arr

さらに、動的に割り当てられたメモリを明示的に解放することを忘れないでください。

2 つ目( Notice )関数内で変数Memory Clobbering Errorを更新しているため、注意してください。binary++printf

printf 内の変数free(binary);を変更しているため、実行時エラーが発生することはありません。最初に戻りアドレスを追加のポインター変数に保存してから、それを解放します。私がやっているように: binary*binary++

 b = binary=bin(a);      
 // loop 
  printf("%d", *binary++); 
 //             ^ changing binary variable to point new memory location  
 // after loop 
 free(b);

変数 free(binary)を変更しているため、動的に割り当てられていないメモリ位置を解放するため、間違っている場合があります。binary

ここで作業コードを取得し、コメントを読んでください。

于 2013-03-18T18:59:07.657 に答える