为什么这个二进制转换不起作用?

时间:2013-05-08 15:30:56

标签: c++ c binary

#include<stdio.h>
#include<conio.h>

unsigned * bin(unsigned n) {
    unsigned a[16];
    int i = 0, j = 0;
    for (i = 0; i < 16; i++) {
        a[i] = n & 0x1;
        n = n >> 1;
    }
    return a;
}

void main() {
    unsigned n = 5;
    int i = 0;
    unsigned * a = bin(n);
    for (i = 15; i >= 0; i--) {
        printf("%d\n", (*(a + i)));
    }
    getch();
}

请帮助此二进制转换不起作用。我尝试使用二进制转换计算x^n。 可以任意帮助??

3 个答案:

答案 0 :(得分:6)

您正在返回指向局部变量的指针。该变量存储在堆栈中,在函数返回后无效。

取消引用此指针将导致未定义的行为。

解决方案是创建变量static,或者将数组作为参数传递给函数,或者(如James Kanze的评论中所述)使用复制内容的类型。

答案 1 :(得分:2)

你不能以这种方式返回函数中定义的本地数组。

当函数完成执行时,数组的内容将被删除。

而不是使用

 unsigned a[16];

您可以使用以下内容:

unsigned *a =malloc(16 * (sizeof *a));

当你的程序中一个数组变得无用时,不要忘记在你的主中释放为a分配的内存。你可以用以下方式释放数组:

free(a);

答案 2 :(得分:0)

实际上,这是使用new(或malloc)是一个非常糟糕的选择的典型情况。但是,正如其他人所说,返回指向本地数组的指针是不好的。

相反,传入一个数组:

void bin(unsigned n, unsigned a[]) {
    int i = 0;
    for (i = 0; i < 16; i++) {
        a[i] = n & 0x1;
        n = n >> 1;
    }
}

并在主要:

unsigned a[16];
bin(n, a);

现在您无需从bin分配或返回数组。