2017-01-19 62 views
1

我有以下代碼ç爲什麼realloc的不工作

void getPariceArray(Board board, treeNode *tn, Position *dst, int **prices, int *counter, int total) 
{ 

    if (tn == NULL) 
     return NULL; 
    if (tn->position[0] == dst[0][0] && tn->position[1] == dst[0][1]) 
    { 
     prices = (int **)realloc(prices, sizeof(prices) *4); 
     prices[*counter] = (int *)malloc(sizeof(int)); 
     printf("%d", sizeof(prices)); 
     *prices[*counter] = total; 
     *counter = *counter + 1; 
    } 

    int x = tn->position[1] - '1'; 
    int y = tn->position[0] - 'A'; 

    int cellPrice = board[x][y] - '0'; 

    total += cellPrice; 

    getPariceArray(board, tn->up, dst, prices, counter, total); 
    getPariceArray(board, tn->down, dst, prices, counter, total); 
    getPariceArray(board, tn->right, dst, prices, counter, total); 
    getPariceArray(board, tn->left, dst, prices, counter, total); 

} 

價格是一個指針數組和遞歸我鑄造的realloc增加價格的大小每一步。 我得到了很多錯誤的錯誤,我有一種感覺,它涉及到分配, 我打印sizeof(價格),我看到它留在4,而不是增加 有人可以告訴我,我哪裏出錯了?

在此先感謝

PS
編輯
我有princt的**價格另一項功能

void printPricesArray(int **arr, int length) 
{ 
    for (int i = 0; i < length; i++) 
    { 
     printf("place:%d Price:%d\n", i, *arr[i]); 
    } 
} 

這是我得到的錯誤,當prices = realloc(prices, sizeof(prices) *4);

error bug 但是當我將這條線更改爲prices = realloc(prices, sizeof(prices) * 150);時,一切都沒有問題錯誤,因爲我知道在我的示例大小不會超過130,但我需要動態增加在不同的示例大小將增加150. no errors bug

+1

'realloc的(價格的sizeof(價格) * 4);'當語句再次運行時,永遠不會做任何不同的事情。內存分配保持在這個大小:4個數組元素。即使'sizeof(價格)',指針的大小,而不是它指向的數據的大小。 –

+0

'我打印sizeof(價格)'。 「價格」是一個指針。 'sizeof'指針總是返回相同的值。另外,你不需要在C中使用'malloc'或'realloc'。 – DeiDei

+0

有沒有辦法增加它? – Brec

回答

1

我想,在代碼編寫和糾正(編譯器)錯誤代碼演變成了一個錯誤的方向。我覺得你實際上不想處理一個指向整數的指針數組,而是一個(動態增長的)整數值數組(不是指向它們的數組)然而,在這種情況下,函數必須重寫指向數組的指針,這導致在界面中再引入一個'*',使您陷入了困境,並且聲明prices[*counter] = (int *)malloc(sizeof(int))指出這是基本的誤解。

讓我在下面的簡短例子中解釋我的意思。 假設我們想要一個函數dynamicPriceListAlloc,它爲nrOfItems整數分配一個整數數組。我們從調用者開始,即函數main:其中,因爲我們想要一個動態分配的整型數組,我們將保存一個類型爲int *的變量,即指向這個數組的指針。因爲我們希望在一個函數中分配數組,所以我們必須傳遞一個指向這個指針的指針,否則這個函數不能將新分配的內存地址分配給這個指針。因此,dynamicPriceListAlloc必須帶有一個指向整數的指針,即int **

但是 - 現在的誤導性的事情 - dynamicPriceListAlloc的意圖不是分配指針與10指針到整數,而是由分配的10整數和分配這個存儲器塊傳遞的指針數組(參考)作爲參數:

int main(){ 

    int *priceList; 
    dynamicPriceListAlloc(&priceList, 10); 

    for (int i=0; i<10; i++) 
     printf("%d\n", priceList[i]); 
} 

void dynamicPriceListAlloc(int **prices, int nrOfItems) { 
    *prices = (int*)malloc(nrOfItems * sizeof(int)); 

    for (int i=0; i<nrOfItems; i++) 
     // *prices[i] = i; // Wrong: takes prices[i] and then dereferences it 
     (*prices)[i] = i; // OK: derefernces prices (yielding a pointer an int-array) and then setting the i'th element 
} 

我想你錯過了糾正*prices[i] = i提領優先級的事情,而不是糾正這(*prices)[i] = i,你通過指針取消引用實際分配存儲「解決」問題。這就是我的意思是「代碼向錯誤的方向演變」。

如果我用這個假設是正確的,那麼你的代碼將發生如下變化:

void getPariceArray(Board board, treeNode *tn, Position *dst, int **prices, int *counter, int total) 
{ 
    if (tn == NULL) 
     return; 
    if (tn->position[0] == dst[0][0] && tn->position[1] == dst[0][1]) 
    { 
     size_t sizeOfPrices = (*counter) * sizeof(int); 
     *prices = (int*)realloc(*prices, sizeOfPrices); 
     printf("size of prices: %ld", sizeOfPrices); 
     (*prices)[*counter] = total; 
     *counter = *counter + 1; 
    } 

    int x = tn->position[1] - '1'; 
    int y = tn->position[0] - 'A'; 

    int cellPrice = board[x][y] - '0'; 

    total += cellPrice; 

    getPariceArray(board, tn->up, dst, prices, counter, total); 
    getPariceArray(board, tn->down, dst, prices, counter, total); 
    getPariceArray(board, tn->right, dst, prices, counter, total); 
    getPariceArray(board, tn->left, dst, prices, counter, total); 
} 

而且printPricesArray將作如下調整:

void printPricesArray(int *arr, int length) 
{ 
    for (int i = 0; i < length; i++) 
    { 
     printf("place:%d Price:%d\n", i, arr[i]); 
    } 
} 
+0

'int **價格'不是我的決定,但是我的學校1,它是一個學校項目,他們給我的功能definision。但我同意,int數組要容易得多。 – Brec

+0

好吧,在二讀之後,我嘗試了一下,它確實有效 – Brec