2013-05-08 4 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을 계산하려고합니다. 수 anybode 도움 ??이 이진 변환이 작동하지 않는 이유는 무엇입니까?

+1

'a'는 자동 저장 기간을 가지며'bin'의 끝까지 살아남지 않습니다. 매달려있는 포인터를 돌려주고 있습니다. 당신은'malloc' (또는'new' up) 배열을 반환하고 호출자에서 free (또는'delete []')를 원할 것입니다. 아니면, C++에서 대신'std :: vector'를 사용하면 평범한 메모리를 처리 할 수 ​​있습니다. – cHao

+0

먼저 (여기서 게시하기 전에)해야 할 일은 아마도 컴파일러 경고를 읽는 것입니다. 일반적으로 컴파일러는 지역 변수를 반환하는 문제를 파악합니다. –

+0

''은 이식 할 수있을뿐만 아니라 그것을 지원하는 몇몇 시스템에서는 더 이상 사용되지 않을 것이며,'main'은 리턴 타입으로'int'를 요구합니다. –

답변

2

이 방법으로 함수에 정의 된 로컬 배열을 반환 할 수 없습니다.

함수의 실행이 끝나면 배열의 내용이 지워집니다. 는 A 배열은 프로그램에서 쓸모가 될 때 a에 할당 된 메모리를 해제

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

그리고 메인에 잊지 마세요 : 대신 다음을 사용할 수 있습니다

unsigned a[16]; 

를 사용

. 다음과 같이 배열을 해제 할 수 있습니다.

free(a); 
+0

배열'std :: vector '(C++로 배열을 선언하는 일반적인 방법)을 선언 할 수 있습니다. –

+0

편집 : 메모리 누수가 확실하게 발생합니다. –

+0

은 unsigned * a = (부호없는 *) malloc (16 * (sizeof * a))을 의미하지는 않습니다. – hayees

5

로컬 변수에 대한 포인터를 반환하고 있습니다. 이 변수는 스택에 저장되며 함수가 반환 된 후에는 유효하지 않습니다.

이 포인터를 역 참조하면 정의되지 않은 동작이 발생합니다.

해결책은 변수 static을 만들거나 함수의 인수로 배열을 전달하거나 (James Kanze의 주석에 명시된 바와 같이) 내용을 복사하는 형식을 사용하는 것입니다.

+0

어떻게 수정해야합니까 ?? – hayees

+1

'std :: vector '를 사용하십시오. 반환 값과 로컬 변수 모두. –

+0

그렇지 않으면 배열을 전달하는 것이 내가 본 C 솔루션 중 최고입니다. –

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

관련 문제