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]);
}
}
我有以下代码
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]);
}
}