c 为什么 realloc 不工作

c why realloc isn't working

我有以下代码

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

}

prices 是指针数组,递归中的每一步我都在使用 realloc 来增加 prices 的大小。 我有很多错误错误,我觉得它与分配有关, 我打印了 sizeof(prices),我看到它保持 4 而没有增加 有人可以告诉我哪里出错了吗?

提前致谢

P.S
编辑
我有另一个函数可以打印 **prices

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

时遇到的错误

但是当我将行更改为此 prices = realloc(prices, sizeof(prices) * 150); 时,一切顺利,没有错误,因为我知道在我的示例中大小不会超过 130,但我需要动态增加以防不同示例大小超过 150。

我想是在编写代码和纠正(编译器)错误的过程中,代码演变成错误的方向。

我觉得您实际上不想处理一个指向整数的指针数组,而是一个(动态增长的)整数值数组(而不是指向它们的指针)。然而,函数必须重写指向数组的指针,导致在接口中多引入一个'*',将您带入困境,语句 prices[*counter] = (int *)malloc(sizeof(int)) 向我表明这是基本的误解。

让我在下面的简短示例中解释我的意思。 假设我们想要一个函数 dynamicPriceListAlloc,它为 nrOfItems 个整数分配一个整数数组。

让我们从调用者开始,即函数 main: 其中,由于我们想要一个动态分配的整数数组,我们将保存一个 int * 类型的变量,即指向该数组的指针。因为我们想在函数中分配数组,所以我们必须传递一个指向 this 指针的指针,否则函数无法将新分配的内存地址分配给 this 指针。因此,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 中的 dereference-precedence 问题,而不是将其更正为 (*prices)[i] = i,您 "solved" 通过实际分配存储来解决问题对于您取消引用的指针。这就是我 "the code evolved in the wrong direction".

的意思

如果我的假设是正确的,那么您的代码将更改如下:

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