用 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 允许的......)而没有任何其他副作用。
我试图找到与我相似的标题问题,但没有找到我想要的。所以这是我的问题。 如果我 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 允许的......)而没有任何其他副作用。