gpt4 book ai didi

c 为什么 realloc 不工作

转载 作者:太空宇宙 更新时间:2023-11-04 03:25:11 25 4
gpt4 key购买 nike

我有以下代码

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 而没有增加有人可以告诉我哪里出错了吗?

提前致谢

附言
编辑
我还有另一个函数可以打印 **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);

时遇到的错误

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

最佳答案

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

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

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

让我们从调用者开始,即函数 main:其中,由于我们想要一个动态分配的整数数组,我们将保存一个 int * 类型的变量,即指向该数组的指针。因为我们想在函数中分配数组,所以我们必须传递一个指向 this 指针的指针,否则函数无法将新分配的内存地址分配给 this 指针。因此,dynamicPriceListAlloc 必须采用指向 int 的指针,即 int **

但是 - 现在误导性的事情 - dynamicPriceListAlloc 的意图不是分配一个有 10 个指针 的指针给 int,而是分配一个 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]);
}
}

关于c 为什么 realloc 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com