【发布时间】:2021-11-19 01:33:22
【问题描述】:
我正在尝试编写一个可调整大小的数组,它会在满时展开。所有功能都在工作,但调整大小的功能却不行。
int main(void)
{
int arr[4];
int *ptr = arr;
initializeEmptyArray(ptr);
insertAtIndex(ptr, 0, 4);
insertAtIndex(ptr, 0, 3);
insertAtIndex(ptr, 0, 2);
insertAtIndex(ptr, 0, 1);
resizeArray(&ptr);
for (int i = 0; i < capacity; i++)
{
printf("%i", arr[i]);
}
}
这会启动我的数组 [1,2,3,4],然后调用调整大小的数组来测试它。
void resizeArray(int **arr)
{
int *newArr = (int *)malloc(capacity * 2 * sizeof(int));
for (int i = 0; i < capacity; i++)
{
newArr[i] = (*arr)[i];
}
for (int i = capacity; i < capacity * 2; i++)
{
newArr[i] = EMPTY;
}
free(*arr);
*arr = newArr;
}
问题是arr 的值在我打印时不会更改为 [1,2,3,4,-1,-1,-1,-1] (-1 代表空)。如何更改指针以指向这个新数组?
Capacity 表示数组支持的元素数量,初始为 4 EMPTY 定义为 -1,表示数组中的一个空槽。
【问题讨论】:
-
请更新问题,使其成为minimal reproducible example。什么是容量,EMPTY,insertAtIndex,Missing 包括。
-
这是未定义的行为。您的初始数组在堆栈上,并且最初没有使用 malloc 分配。因此,当您的 resize 函数尝试在其上调用
free时,未定义的行为。我很惊讶它没有崩溃。 -
这是我的第一个问题,感谢您的提示。我调整了你的要求。谢谢
-
有道理,但即使没有free(),结果也是一样的。修复它是一个悲伤的尝试。
-
您正在更新
ptr以指向一个新数组,然后打印arr(旧的局部变量数组)。