我正在尝试编写一个可调整大小的数组,该数组在满时会扩展。所有功能都在工作,但调整大小的一个不是。
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 表示空)。如何更改指针以指向这个新数组?
容量代表阵列支持的元素数量,初始化为 4 EMPTY 定义为 -1,代表阵列中的一个空槽。
代码的两个主要问题是,arr
它在堆栈上分配main()
,然后free()
在resizerArray()
. 这是一个缺陷,我修复了我的堆分配arr
问题main()
。在您的循环中,您打印arr[i]
但传递ptr
给resizeArray()
更新的内容,但arr
仍指向现在已释放的内存。我通过消除ptr
变量解决了这个问题:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EMPTY 0
void resizeArray(int **arr, size_t capacity) {
int *newArr = malloc(2 * capacity * sizeof(int));
// for (int i = 0; i < 2 * capacity; i++) {
// newArr[i] = i < capacity ? (*arr)[i] : EMPTY;
// }
memcpy(newArr, *arr, capacity * sizeof(int));
memset(newArr + capacity, EMPTY, capacity * sizeof(int));
free(*arr);
*arr = newArr;
}
int main(void) {
size_t capacity = 4;
int *arr = malloc(capacity * sizeof(int));
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
for (int i = 0; i < capacity; i++) {
printf("before: %d\n", arr[i]);
}
resizeArray(&arr, capacity);
capacity *= 2;
for (int i = 0; i < capacity; i++) {
printf("after: %d\n", arr[i]);
}
}
我注释掉了 resizeArray 中的循环,这样你就可以看到你将如何做到这一点。代码打印:
before: 1
before: 2
before: 3
before: 4
after: 1
after: 2
after: 3
after: 4
after: 0
after: 0
after: 0
after: 0
双方resizeArray()
并调用代码必须了解的因素2
。这不是一个伟大的设计。也许传递新旧容量?或者size_t *capacity
如果您想对因子进行硬编码,则可以更新它resizeArray()
?请记住检查 的返回值malloc()
以确保它没有失败。
有关realloc()
调整堆分配内存大小的标准方法,以及calloc()
如何获取预初始化内存,请参见。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句