2013-10-13 6 views
-1

이 함수가 호출에서 반환되면 그 함수에서 아무 것도 인쇄 할 수 없습니다. 함수 내에서 인쇄를 시도하면 제대로 작동하지만 호출 후에는 인쇄되지 않습니다. 무엇을해야할지 모르겠습니다.함수에 대한 포인터 전달

getSchedFile(schFile, sched); 

에 :

int *sched; 
    getSchedFile(schFile, sched); 
    printf("%d\n",sched[1]); 

void getSchedFile (FILE *file, int *schd){ 
    /* Get the number of bytes */ 
    fseek(file, 0L, SEEK_END); 
    int bytes = ftell(file); 
    fseek(file, 0L, SEEK_SET); 
    schd = malloc(bytes * sizeof(int)); 
    int pos = 0, curDigit; 
    while((fscanf(file, "%d", &curDigit)) != EOF){ 
     schd[pos]=curDigit; 
     ++pos; 
    } 
} 
+0

"sched"포인터에 포함 된 값의 사본을 * 함수에 전달합니다. 함수 내에서 * copy * 값을 malloc 메모리의 주소로 설정합니다. 포인터를 포함하는 메모리의 주소가 아니라 포인터에 저장된 값을 전달하기 때문에 변경 내용이 삭제됩니다. '* sched'의 주소를 전달하면, ('sched')가 가리키는 위치를 변경할 수 있습니다 - 일명 변경 사항을 유지할 수 있습니다. – enhzflep

+0

가능한 [C에서 전달하는 char 포인터] (http://stackoverflow.com/questions/14331411/passing-char-pointer-in-c) –

+0

'^^'는 문자 그대로 Google *의 첫 번째 히트입니다. * "전달 포인터가 작동하지 않습니다 C". 질문하기 전에 조사를 해보 시지 않겠습니까? –

답변

1

당신은 변경하여, 포인터에 대한 포인터를 전달해야

getSchedFile(schFile, &sched); 

과 :

void getSchedFile (FILE *file, int *schd) { 

에 :

void getSchedFile (FILE *file, int ** schd) { 

그렇지 않으면 함수에서 포인터의 로컬 버전 만 변경하고 원래 포인터는 변경하지 않습니다. 당신이 %d로 읽는 경우

void getSchedFile (FILE *file, int ** schd) { 

    /* Get the number of bytes */ 

    fseek(file, 0L, SEEK_END); 
    int bytes = ftell(file); 
    fseek(file, 0L, SEEK_SET); 

    int * pschd = malloc(bytes * sizeof(int)); 
    if (pschd == NULL) { 
     fprintf(stderr, "Couldn't allocate memory.\n"); 
     exit(EXIT_FAILURE); 
    } 

    int pos = 0, curDigit; 
    while((fscanf(file, "%d", &curDigit)) != EOF){ 
     pschd[pos]=curDigit; 
     ++pos; 
    } 

    *schd = pschd; /* Update original pointer */ 
} 

찰리 언급으로, 파일의 바이트 수는 동일하지 않을 : 너무 많은 간접을 피하는 단순화하기 위해, 당신은 함수를 변경할 수 있습니다 int의 수를 읽으십시오. 최소한 메모리를 할당하지는 않겠지 만.

편집 : 당신은 또한 단지에 대한 pos을 반환 int의 기능에게 반환 유형을주고 발신자가 당신의 새로운 배열 (또는 마지막 요소의 인덱스에 얼마나 많은 요소를 알 수 있도록, pos - 1를 반환 할 수 있습니다 요소의 실제 수).

+0

고마워요. 그래, % d는 할당하는 것 이상의 의미라는 것을 알고 있지만 다른 방법은 모른다. 나는 적어도 그것이 대략적인 견적 일 것이라고 생각했다. – Boyo

+0

@ThomasTheTankEngine : 최악의 경우 하나의 숫자가 올 것이고 그 다음 하나의 공백 문자가 뒤 따르기 때문에 적어도 (바이트/2) + 1을 할 수 있습니다. 공간에 더 효율적이지만 시간에 덜 효율적인 두 번째 방법은 파일을 통과시켜 계산하고, 정확한 양의 메모리를 할당 한 다음 실제로 읽은 후 저장하기 위해 두 번째 통과를 수행하는 것입니다. 일단 필요한 크기가 알려졌다면'realloc()'을 호출하는 것이 또 다른 옵션이다. –

관련 문제