重置一个数组

问题描述 投票:0回答:1

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

c malloc realloc
1个回答
1
投票

当你 realloc 用更小的尺寸,很多实现就什么都不做了:你有一个至少可以容纳10个元素的bloc,它至少可以容纳8个元素。简单地说,你不应该再使用超过声明大小的元素。没有什么能阻止你这样做,但它只是调用了Undefined Behaviour。

对于初学者来说,这可能是令人惊讶的。

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允许的......),而不会产生任何其他的副作用。


0
投票

realloc()和reallocarray()函数就起到了这样的作用.方法头实际上是。

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

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

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

如果你想实现这种行为,请在重新分配之前安排你的数组。

更多的信息可以在手册页中找到 (请在此输入链接描述)和一些网站中。

© www.soinside.com 2019 - 2024. All rights reserved.