2013-01-12 51 views
0

我有一個初學者問題 我需要將一個指針傳遞給一個函數,然後爲這個指針分配dinamic內存。 我在主函數中創建了指針,然後將它傳遞給應該分配內存的特定函數。但我得到這個錯誤: 「hist_array可以使用此功能初始化」malloc內存分配

這是從程序rellavent線: 從主:

int* hist_array; 
    fillHistogram(first_image,hist_array,max_value+1); 

功能:

void fillHistogram(int image[M][N], int* hist, int histLen){ 
    hist=(int*)malloc(sizeof(histLen)*(histLen)); 

我不能改變函數的簽名,它是作爲結構化文件給予我們的。所以我想知道我做錯了什麼。

和另一個問題。我使用malloc創建的新數組,我希望它在開始時的所有值都是0.我如何以最短的方式執行該操作?

+0

爲什麼要分配空間來存儲指針?無論如何你必須將結果存儲在指針中,爲什麼不把函數指針存儲在那裏呢? –

+1

關於另一個問題,使用'calloc','void * calloc(size_t nmemb,size_t size);',它爲每個大小爲size的'nmemb'對象分配空間,併爲分配的內存填零。 –

+0

calloc在這項任務中是不允許的 – littlerunaway

回答

2

意圖似乎是調用代碼在調用fillHistogram之前會進行分配。

您的解決方案的問題在於histfillHistogram是您傳入的指針的副本。當您更改副本時,原件仍未初始化。

而你可能意思是sizeof(int)*histLen

+0

我的意圖是在fillhistogram函數內部爲hist_array分配內存,然後在我用它應該得到的值填充它之後將它用於其他事情。 – littlerunaway

+0

這個指針+數組+函數的整體組合對我來說還不是很清楚,所以我很難用它。 – littlerunaway

+1

@littlerunaway:如果你想在'fillHistogram'中分配數組,你需要一些從'fillHistogram'返回它的方法,它需要改變簽名(你說你不能這樣做),以返回新的hist_array直接或者接受hist_array寫入的額外'int **'參數。 –

0

首先,我想你在你身上缺少括號sizeof。 Sizeof是一個函數,它需要它的參數。做sizeof(histLen)*(histLen)告訴malloc'預留'sizeof(maxvalue + 1),歷史時間。我認爲你可能想要的,因爲hist_array是一個指向int的指針,是分配一個整數向量。 這與做:

hist=malloc(histlen*sizeof(int)); /*I think it gets more easy to read with the lenght multiplier on the left*/ 

這告訴的malloc爲histlen整數 '儲備' 的記憶。

另一件事,因爲你通過hist_array作爲參數,並且你不返回malloc返回指針hist_array,你應該在你的函數中說你想在主函數中修改它的值。 這被稱爲通過引用傳遞參數,並且在函數內部改變它的值,你需要說你想改變變量的值而不是變量的副本。 這看起來像這樣:

*hist=malloc(histlen*sizeof(int)); /*The pointed by hist, which hist_array, is equal to malloc etc..*/ 

希望這會有所幫助。