我正在编写一个带有函数add(a,i,n)的程序,该函数会将'i'作为元素添加到'a'中,但是如果数组'a'空间不足,那么我需要重新分配更多空间内存到数组。我被困在这里:
#include <stdlib.h>
#include <stdio.h>
int add(int* a, int i, int n);
int main(){
int n = 20;
int *a = (int*) malloc(n*sizeof(int));
int i;
for (i = 0; i < 100000; i++){
n = add(a, i, n);
printf("a[%d]=%d\n",i,(int)a[i]);
}
return 0;
}
int add(int *a, int i, int n){
if (i >= n){
n++;
int* b = (int*) realloc(a, n*sizeof(int));
a[i]=i;
return n;
}else{
}
}
我不是很有经验,所以请保持温柔...
答案 0 :(得分:0)
realloc
尝试重新分配给定的内存,但有时却无法重新分配给您新的内存指针。
它的用法必须类似于:
int *b;
b = realloc(a, <newsize>);
if (b) {
/* realloc succeded, `a` must no longer be used */
a = b;
/* now a can be used */
printf("ok\n");
} else {
/* realloc failed, `a` is still available, but it's size did not changed */
perror("realloc");
}
现在,您的代码仍然有麻烦:
函数add()
的想法是在需要时重新分配a
,但是a
是由副本给出的,因此其值不会在main
中更改。 / p>
#include <stdlib.h>
#include <stdio.h>
int add(int** a, int i, int n);
int main(){
int n = 20;
int *a = malloc(n*sizeof(int));
int i;
for (i = 0; i < 100000; i++) {
/* note how `a` is passed to `add` */
n = add(&a, i, n);
printf("a[%d]=%d\n",i,a[i]);
}
/* and finally free `a`*/
free(a);
return 0;
}
/* changed `a` type to make its new value visible in `main` */
int add(int **a, int i, int n){
if (i >= n){
/* want to write a[i], so size must be at least i+1*/
n = i+1;
/* realloc memory */
int *b = realloc(*a, n*sizeof(int));
/* check that `realloc` succeded */
if (!b) {
/* it failed!*/
perror("realloc");
exit(1);
}
/* store new memory address */
*a = b;
}
/* update memory */
(*a)[i]=i;
/* return new size */
return n;
}
注意:我删除了malloc
/ realloc
演员表,请参阅:Do I cast the result of malloc?
答案 1 :(得分:-1)
要在C
中有一个自动增长的数组,通常需要一个辅助函数ensure_capacity
来处理数组的重新分配。
最好使用2倍增长策略来重新分配helper函数,这样您就可以使用 append 操作摊销固定时间。
代码如下所示。
请注意,代码使用数组的前2个元素来保持其容量/大小。您可以改用struct
指针+大小,但是您必须将两者保持紧密靠近,否则代码将不容易阅读。
int* ensure_capacity(int* vec, int new_cap) {
if (vec == 0) {
vec = (int*) malloc(18 * sizeof(int));
vec [0] = 16;
vec [1] = 0;
} else {
int cap = vec[0];
if (cap < new_cap) {
do {
cap *= 2;
} while (cap < new_sz);
int* new_vec = (int*) realloc(vec, cap * sizeof(int));
if (new_vec != null) {
vec = new_vec;
vec[0] = cap;
} else {
// reallocation failed, handle the error
}
}
}
return vec;
}
您将在add()
函数中使用它,例如:
int* push_back(int* vec, int val) {
vec = ensure_capacity(vec, vec[1] + 1);
vec[vec[1]++] = val;
return vec;
}