2012-05-26 2 views
1

나는 코드의 조각을 가지고 :동적 메모리 위치 C 인수 INT는 *

나는이 방법으로 사용
void Read(int T[], int len) { 
    int i; 
    T = (int*) malloc(len * sizeof *T); 
    for (i=0;i<len;i++) { 
     scanf("%d", &T[i]); 
    } 
} 

:

int *T; 
Read(T,len); 

다음, 내 테이블을 쓰기 싶어 :

void Write(int T[], int len) { 
    int i; 
    for(i=0;i<len;i++) { 
     printf("%d, ", T[i]); 
    } 
    printf("\n"); 
    return; 
} 

그리고 그것을 사용 :

Write(T,len); 
,

잘못된 결과가 나옵니다. 나는 그 문제가 '&'으로 연결되어 있다고 확신하지만 나는 그것을 다룰 수 없다. 사전에

감사

+0

당신이 어떤 결과를 얻을 수 있습니까? 그들은 당신에게 아무것도 말하지 않습니까? – cdarke

답변

2

하나의 문제는 당신이 당신의 Read 함수 내에서 지역 변수 T을 수정하고 있다고 할 수있다 : Read 내부

T
int *T; 
Read(T, len); 
// ... 

void Read(int T[], int len) { 
    int i; 
    T = (int*) malloc(len * sizeof *T); 
    // ... 
} 

실제 T 변수의 복사본입니다. 사본에 새 값을 지정하지만 원본은 변경되지 않습니다.

실제로 외부 T 수정과 같이 그것의 포인터를 전달하려면 :

int *T; 
Read(&T, len); 
// ... 

void Read(int **T, int len) { 
    int i; 
    *T = (int*) malloc(len * sizeof *T); 
    for (i=0;i<len;i++) { 
     scanf("%d", &(*T)[i]); 
    } 
} 
1

(Write가 변경되지 않습니다 기능) 다음을 시도해보십시오

void Read(int T[], int len) { 
    int i; 
    for (i=0;i<len;i++) { 
     scanf("%d", &T[i]); 
    } 
} 

T = (int*) malloc(len * sizeof *T); 
Read(T,len); 

Write(T,len); 

UPDATE을 : 메모리를 할당 할 Read를 원한다면, 그것은에 대한 포인터를받을 것 포인터 :

void Read(int *T[], int len) { 
    int i; 
    T = (int**) malloc(len * sizeof **T) 

    for (i=0;i<len;i++) { 
     scanf("%d", &(*T)[i]); /* not the easiest expression in the language */ 
    }   
} 

Read(&T, len); 
Write(T, len); 

실제로는 수정할 수 있습니다. Read 포인터를 직접 반환 할 수도 있지만 어쩌면 원하는 것은 아닙니다 : int *Read(int len) { ... }.

+0

예, 게시하기 전에 시도했지만 작동하지만 내 방법으로 메모리 할당을 이동하려고합니다. – ruhungry

+0

아, 업데이트 된 답변보기 – rodrigo

1

네이트의 솔루션은 모든 좋은 멋쟁이 아직 나는 약간 세련 찾을 수 있습니다.

C 자체는 그 자체로 상당히 난독 화되어 있으며 왜 그렇게 두 배나 더 많이 만들지는 알 수 없습니다. 다음을 사용하는 것이 좋습니다.

void Read(int T[], int len)의 서명을 int* Read(int T[], int len)으로 변경하십시오.

여러 가지 이점이 있습니다. 코드가 더 읽기 쉽게 만들어 줄뿐 아니라 불쾌한 읽기가 함께 나오는 "숨겨진"부작용을 없애고 의도가 무엇인지 명확하게 나타내므로 free()을 잊지 않을 가능성이 적습니다. 단순히 포인터가 반환된다는 것을 알기 때문에 함수에 부적절한 동적 할당이 있었음을 알 수 있습니다. 또한 걱정할 필요가없는 간접 참조 수준이 한 가지 있습니다.

그런 다음 다음을 수행 할 수 있습니다

int* Read(int T[], int len) { 
    int i; 
    T = (int*) malloc(len * sizeof(T)); 
    for (i=0; i<len; ++i) { 
     scanf("%d", &T[i]); 
    } 
    return T; // Basically the only change! 
} 

지금, 당신의 Read() 호출하는 함수 :

int main() { 

const int size = 5; 
int *T = 0; // It's not needed to do a prior declaration and initialization 
      // but it does silence a warning which is a good thing. 
T = Read(T, size); 
Write(T, size); 

// Do more stuff and free() whenever needed 

return 0; 
}