2012-01-25 104 views
0

我有這樣的代碼現在:傳遞一個結構的內容,另一個變量用C

pacient sortClients(int n, pacient *lista, int print) 
{ 
    pacient aux[50]; 

    for(i=0;i<n;i++) 
    *(aux+i)=*(lista+i); 

    //some modifications performed on aux 

    return *aux; 
} 

void sortAndShowByAge(int n, pacient *lista) 
{ 
    pacient aux[50]; 
    *aux=sortClients(n,lista,0); 

} 

最後一個函數是我遇到麻煩。如果aux只有一個記錄,那麼它工作正常,如果有兩個以上的記錄,它會顯示一些奇怪的字符。在第一個函數中,我遍歷lista並將每條記錄保存到aux。有沒有辦法將sortClient的aux直接指定給shortAndShowByAge中的aux,而不是迭代?我無法迭代sortClients。

+0

請發表實際的代碼。這段代碼甚至沒有編譯,顯示邏輯也沒有顯示。 –

回答

2

你的代碼只返回一個元素,而不是整個數組。它不能合法地返回數組,因爲它是一個局部變量。

您需要動態分配新內存,或者就地排序。

前者,這是最喜歡你有什麼已經,會是這樣的:

pacient * sortClients(int n, const pacient *lista, int print) 
{ 
    pacient *aux; 

    if((aux = malloc(n * sizeof *aux)) != NULL) 
    { 
     memcpy(aux, lista, n * sizeof *aux); 
     /*some modifications performed on aux */ 
    } 
    return aux; 
} 

這會返回一個指向排序/處理的陣列,你必須當你做了呼叫free()與,爲了不泄漏記憶。

我alao糾正了返回類型,並使用memcpy()而不是手動循環來複制輸入值。輸入數組也被標記爲const,因爲它是隻讀函數。

+0

原始代碼不返回指向本地的指針,它只是通過值返回單個數組元素。儘管我認爲OP的意圖是返回一個指向本地數組的指針,這將是一個UB。 –

+0

@DavidHeffernan:謝謝,更新(@Als,也是)。 – unwind

+0

@unwind謝謝你,它完美的作品。這正是我想要的 – Andrew

1

的問題是:的pacient

pacient sortClients(int n, pacient *lista, int print) 

回報一個實例。它不返回數組:

return *aux; /* <---- synonymous with return aux[0]; */ 

sortAndShowByAge(),將出現以下的被返回的單個元素,並將其複製到aux[0]

*aux=sortClients(n,lista,0); /* <---- synonymous with aux[0]=... */ 

我認爲最好的方式來解決這個問題只會有sortClients()修改提供的數組到位,而不必返回任何東西。這將修復這個錯誤,並且會擺脫許多不必要的複製。

0

將指針指向aux作爲函數的參數。此外,您還可以使用memcpy而不是一個循環(除非你在環路這些修改):

void sortClients(int n, pacient *lista, pacient *aux, int print) 
{ 
    memcpy(aux, lista, n * sizeof(pacient)); 

    //some modifications performed on aux 
} 

void sortAndShowByAge(int n, pacient *lista) 
{ 
    pacient aux[50]; 
    sortClients(n,lista,aux,0); 

} 

你可以,當然,使用for循環你已經離開。關鍵是在調用者中創建aux,並將指針傳遞給它。

0

您的排序函數不會返回有效的內容,因爲aux是在函數中本地聲明的。

相反,你可以聲明與它裏面的數組的結構,並返回得到一份

typedef struct ret 
{ 
    pacient aux[50]; 
} ret_t; 

... 

ret_t sortClients(int n, pacient *lista, int print) {...} 

,或者你在你的函數使用malloc分配數組並返回該內存塊的地址

pacient* sortClients(...) 

pacient *aux = malloc(50 * sizeof(pacient)); 
... 

return aux; 
相關問題