2012-05-26 29 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

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

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

TRead是真正的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; 
}