2017-01-19 4 views
1

У меня есть следующий кодс почему перераспределить не работают

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); 

} 

цены на массив указателей и каждый шаг в рекурсии Я литье перераспределить, чтобы увеличить размер цены. У меня появилось много ошибок ошибок, и у меня было чувство, что это связано с распределением, Я напечатал 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, но мне нужно динамическое увеличение incase в разных размерах примера будет более 150. no errors bug

+1

'перераспределить (цены, SizeOf (цены) * 4); 'никогда не делает ничего другого, когда оператор запускается снова. Распределение памяти остается в таком размере: 4 элемента массива. Даже с 'sizeof (prices)' - размер указателя, а не размер данных, на которые он указывает. –

+0

'Я напечатал sizeof (цены)'. 'prices' - указатель. 'sizeof' указатель всегда будет возвращать то же самое. Кроме того, вам не нужно бросать 'malloc' или' realloc' в C. – DeiDei

+0

есть ли способ его увеличить? – Brec

ответ

1

Я полагаю, что во время написания кода и исправления (компилятора) ошибки код превратился в неправильное направление.

Я чувствую, что на самом деле вы не хотите обрабатывать массив указателей на целые числа, но (динамически растущий) массив целых значений (а не указатели на них). Однако то обстоятельство, что функция должна переписать указатель на массив, что привело к введению еще одного «*» в интерфейсе, привело вас к дилемме, и оператор prices[*counter] = (int *)malloc(sizeof(int)) указывает мне, что это основное недоразумение.

Позвольте мне объяснить, что я имею в виду, на следующем коротком примере. Предположим, что мы хотим иметь функцию dynamicPriceListAlloc, которая выделяет массив целых чисел для целых чисел nrOfItems.

Начнем с вызывающего, т. Е. Функции main: В этом случае, поскольку мы хотим иметь динамически распределенный целочисленный массив, мы будем содержать переменную типа int *, то есть указатель на этот массив. Поскольку мы хотим, чтобы массив был выделен в функции, мы должны передать указатель на этот указатель, потому что иначе функция не могла бы назначить выделенный выделенный адрес памяти этому указателю. Следовательно, dynamicPriceListAlloc должен принимать указатель на указатель на int, т. Е. 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 ** prices» не было моим решением, но моя школа 1, ее школьный проект, и они дали мне определение функции. но я согласен, int array был намного проще. – Brec

+0

хорошо, после второго чтения я попробовал, и он действительно работает – Brec

 Смежные вопросы

  • Нет связанных вопросов^_^