2012-09-07 33 views
2

我有主指針,我不知道它的大小。一個函數將這個指針返回給main。在函數內部,我可以計算指針的大小,因此需要在其中存儲值並將它們返回給main。在這種情況下如何修改/分配內存。如何在這種情況下分配內存?

int main() 
{ 
    int *row_value, *col_value; 
    col_row_value(row_value,col_value); 
    ... 
    return(0); 
} 

void col_row_value(row_value,col_value) 
{ 
    // how to allocate/modify memory for row_value and col_value and store data 
    // for example would like to allocate memory here 
    int i; 
    for(i=0;i<10;i++) { 
     row_value[i]=i; 
     col_value[i]=i; 
    } 
} 

我想這樣的事情,這是行不通的

int main() 
{ 
    int *row_value, *col_value; 
    row_value=NULL; 
    col_value=NULL; 
    col_row_value(&row_value,&col_value); 
    ... 
    return(0); 
} 

void col_row_value(int **row_value,int **col_value) 
{ 
    // how to allocate/modify memory for row_value and col_value and store data 
    // for example would like to allocate memory here 
    int i; 
    *row_value=(int*)realloc(*row_value,10*sizeof(int)); 
    *col_value=(int*)realloc(*col_value,10*sizeof(int)); 
    for(i=0;i<10;i++) { 
     row_value[i]=i; 
     col_value[i]=i; 
    } 
} 
+0

程序設計:爲什麼使用變量的代碼不知道它們的大小?爲什麼你想要一個只關心設置值的函數來完成一個完全不同的任務,即動態內存分配?你爲什麼不能從調用者那裏做到這一點? – Lundin

+0

純粹作爲利益的問題,你爲什麼離開位置0不變? –

+0

我不知道這是否是這種情況,但總的來說,您最好在col_row_vaule中返回分配字段的大小。 –

回答

1

此:

*row_value=(int*)realloc(row_value*,10*sizeof(int)); 

應該是:

*row_value = realloc(*row_value,10*sizeof(int)); 
       /**^**/ 

注投是不必要的。如果重新分配失敗,則將realloc()的結果分配給臨時指針,這意味着原始內存將無法訪問。因爲它開始於索引1for內的分配應當是

for(i=1;i<10;i++) 

int* tmp = realloc(*row_value, 10 * sizeof(*tmp)); 
if (tmp) 
{ 
    *row_value = tmp; 
} 

注意for循環沒有在row_valuecol_value分配一個值到所述第一元件

(*row_value)[i] = i; 
(*col_value)[i] = i; 
1

第二個版本是基本上是正確的。

你需要說:

realloc(*row_value, 10 * sizeof(int)); 
//  ^^^ 

心靈的明星!

如果有幫助,重命名功能參數:

col_row_value(int ** ptr_to_row_ptr, int ** ptr_to_col_ptr); 

這樣一來,你就不會混淆自己一樣多。