2013-05-08 71 views
0
#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。 可以帮助吗?为什么这个二进制转换不起作用?

+1

'a'具有自动存储持续时间,并且不会超过'bin'结束。你正在返回一个悬挂指针。你会希望'malloc'(或'new' up)一个数组返回,并在调用者中释放(或'delete []')它。或者,在C++中,改为使用'std :: vector',这将为您处理世俗的内存。 – cHao 2013-05-08 15:33:02

+0

首先要做的事情(在发布之前)可能会读取编译器警告。你的编译器通常会返回返回局部变量的问题。 – 2013-05-08 15:36:46

+0

我应该补充说''不仅不可移植,而且在少数支持它的系统上不推荐使用,并且'main'需要'int'作为返回类型。 – 2013-05-08 15:37:33

回答

2

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

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

而是采用

unsigned a[16]; 

您可以使用以下方法:

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

而且在主不要忘记释放分配给a的内存中,当一个阵列中的程序变得毫无用处。您可以将该阵列释放:

free(a); 
+0

如果你声明数组'std :: vector '(用C++声明数组的常规方法),你可以。 – 2013-05-08 15:36:07

+0

重新编辑:一种可靠的解决内存泄露的方式。 – 2013-05-08 15:36:32

+0

didnot u表示无符号* a =(无符号*)malloc(16 *(sizeof * a)); – hayees 2013-05-08 15:39:26

5

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

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

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

+0

如何纠正? – hayees 2013-05-08 15:34:36

+1

使用'std :: vector '。作为返回值和局部变量。 – 2013-05-08 15:35:32

+0

否则:传递数组是我迄今见过的最好的C解决方案。 – 2013-05-08 15:38:24

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返回数组。

+0

感谢这个作品 – hayees 2013-05-08 15:49:09