使用“realloc”调整现有数组的大小

resizing an existing array using `realloc`

提问人:altair00 提问时间:7/15/2022 更新时间:7/15/2022 访问量:553

问:

我定义了一个数组,我尝试使用调整大小,但它不起作用。我的问题是我可以使用还是必须使用或首先定义数组然后使用?realloc()arr[]calloc()malloc()realloc()

这是我到目前为止的工作......

#include <stdio.h>
#include <stdlib.h>

void printArray (int *arr, int size) {

    printf("{");

    for (int i=0; i<size; i++) {
        if (i == size-1) {
            printf("%d", arr[i]);
        } else {
            printf("%d, ", arr[i]);
        }
    }

    printf("}\n");
}


int main () {


    int arr[] = {1, 2, 3};

    int size = sizeof(arr)/sizeof(arr[0]);

    printArray(arr, size);

    ////////////////////////////////////////

    int newSize = size++;

    arr = realloc(arr, newSize*sizeof(int));

    printArray(arr, newSize);


    return 0;
}
c malloc realloc calloc

评论

3赞 Ian Abbott 7/15/2022
realloc只能用于调整由 、 和类似函数分配的内容的大小。此外,如果增加分配对象的大小,则从旧大小到新大小的额外部分将被垃圾填满,因此打印其内容将打印垃圾。malloccallocreallocrealloc
5赞 Thomas Jager 7/15/2022
只能重新分配使用 、 或 进行的动态内存分配。不能将指向本地对象的指针传递给 ,并且赋值给数组不起作用。malloccallocreallocrealloc
1赞 chux - Reinstate Monica 7/15/2022
altair00,数组大小一旦定义就无法更改。代码可以重新分配之前分配的内存。

答:

0赞 Vlad from Moscow 7/15/2022 #1

对于初学者来说,你的意思似乎是

int newSize = ++size;

而不是

int newSize = size++;

正如克雷格·埃斯蒂(Craig Estey)在其评论中指出的那样。

此数组

int arr[] = {1, 2, 3};

具有自动存储期限。

您可以重新分配已分配存储持续时间的数组,该数组是使用函数 malloc、calloc 或 realloc 分配的数组。

请注意,如果阵列分配了存储持续时间,则在调用 realloc 之后arr

int newSize = ++size; // not size++

arr = realloc(arr, newSize*sizeof(int));

数组的最后一个元素具有不确定的值,因为它未初始化。

评论

1赞 Craig Estey 7/15/2022
int newSize = size++; --> int newSize = ++size;还是[更好]?int newSize = size + 1;
0赞 Vlad from Moscow 7/15/2022
@CraigEstey谢谢。一句傻话。我很细心:)