2013-10-13 65 views
-1

當這個函數從它的調用返回時,我似乎無法打印任何東西。當我嘗試從函數內打印時,它可以正常工作,但在通話後不會打印。不知道該怎麼辦。傳遞函數指針

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) – 2013-10-13 05:08:10

+0

這個'^^'**實際上是Google * *「傳遞指針不起作用C」。爲什麼不問研究之前呢? – 2013-10-13 05:08:47

回答

1

你應該通過一個指向指針,通過改變:

getSchedFile(schFile, sched); 

到:

getSchedFile(schFile, &sched); 

和:

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

到:

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

否則你只是改變函數中的指針的本地版本,而不是你原來的版本。爲了避免過多的間接簡單,你可以改變功能:

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 */ 
} 

查理提到,如果你與%d閱讀,然後字節的文件的數量不會是相同的因爲您從中讀取的數量爲int,儘管您至少不會分配太少的內存。

編輯:您也可能想給該函數返回類型的int並返回pos - 1,使來電者知道有多少元素在新數組(或最後一個元素的索引,只返回pos爲實際數量的元素)。

+0

謝謝你的工作。是的,我知道%d意味着過度分配,但我不知道有任何其他方式來做到這一點。我認爲至少這是一個粗略的估計。 – Boyo

+0

@ThomasTheTankEngine:你至少可以做'(bytes/2)+ 1',因爲最壞的情況會是一個數字,然後是一個空白字符,一直到文件末尾。第二種方法是在空間效率更高但時間效率更低的情況下,可以通過文件並對它們進行計數,分配正確的內存量,然後再次進行實際讀取和存儲。一旦知道必要的尺寸,調用'realloc()'是另一種選擇。 –