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;
}

输出应该是 char '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 output来自 bin()的额外变量

我已经更正了您的代码,如下所示,没有太大变化:

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;
}

注意删除未使用的变量carr

此外,不要忘记显式释放动态分配的内存:

第二注意)要注意,Memory Clobbering Error因为您正在通过函数更新binary变量。++printf

只是简单,free(binary);它不会产生运行时错误,因为您正在修改binaryprintf 中的变量*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 回答