2013-05-08 68 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