用 c 重新分配一个数组

realloc an array with c

我试图找到与我相似的标题问题,但没有找到我想要的。所以这是我的问题。 如果我 malloc 一个大小为 10 的数组,它是否能够重新分配大小并将其变为 9?还有 8 等等?如果可以的话,如果我有这个数组: [1,2,3,4,5,6,7,8,9,10] 我怎么知道哪个单元格将被删除?是否可以选择每次删除哪一个?

realloc() 和 reallocarray() 函数可用于此目的。 方法头实际上是:

void *realloc(void *ptr, size_t size);
void *reallocarray(void *ptr, size_t nmemb, size_t size);

其中 *ptr 是指向您要重新分配的内存的指针。

但是,你无法选择。如果增加大小,旧的元素将保持原样,最后会有一些元素未定义(null)。如果你减少它,内存 space 将是 "cut",这意味着,如果你有 10 个元素的 space,并且你重新分配 6 个,最后 4 个元素将不可访问。

如果您想实现该行为,请在重新分配之前安排您的数组

更多信息可以在手册页 (enter link description here) 和几个网站中找到。

当你 realloc 尺寸较小时,许多实现什么都不做:你有一个可以容纳至少 10 个元素的块,它可以容纳至少 8 个元素。简单地说,您将不再使用超过声明大小的元素。没有什么会阻止你这样做,但它只会调用未定义的行为。

初学者可能会感到惊讶:

int *arr = malloc(10 * sizeof(int));   // allocate an array of 10 int
for (int i=0; i<10; i++) {             // initialize it with 0-9
    arr[i] = i;
}
arr = realloc(arr, 8*sizeof(int));     // realloc the array to 8 elements
for (int i=0, i<8; i++) {
    printf(" %d", i);
}
printf("\n");                          // should have correctly printed 0 1 ... 7
// the interesting part
for (int i=8; i<10; i++) {
    printf(" %d", i);                  // Oops, UB!
}
printf("\n");                          // but what is to be expected is just 8 9...

现在 它可以工作但是是 UB。换句话说永远不要假装我说的是正确的代码。但是大多数实现会接受它并给出预期的结果(这是 UB 允许的......)而没有任何其他副作用。