我正在尝试使用此线程C dynamically growing array上建议的代码实现动态数组。我想从函数返回一个struct Array,但是我在foo()
的第一行得到了一个错误(在'struct'之前的错误预期表达式)。我已经看到了很多其他的例子,但解决方案似乎并不适用。如果其中一个人这样做,我表示歉意。这是我的完整代码:
typedef struct {
int *array;
size_t used;
size_t size;
} Array;
void initArray(Array *a, size_t initialSize) {
a->array = (int *)malloc(initialSize * sizeof(int));
a->used = 0;
a->size = initialSize;
}
void insertArray(Array *a, int element) {
// a->used is the number of used entries, because a->array[a->used++]
//updates a->used only *after* the array has been accessed.
// Therefore a->used can go up to a->size
if (a->used == a->size) {
a->size *= 2;
a->array = (int *)realloc(a->array, a->size * sizeof(int));
}
a->array[a->used++] = element;
}
void freeArray(Array *a) {
free(a->array);
a->array = NULL;
a->used = a->size = 0;
}
struct Array foo ()
{
Array a;
int i;
initArray(&a, 5); // initially 5 elements
for (i = 0; i < 100; i++)
insertArray(&a, i); // automatically resizes as necessary
printf("%d\n", a.array[9]); // print 10th element
printf("%d\n", a.used); // print number of elements
freeArray(&a);
return struct Array a;
}
答案 0 :(得分:0)
我看到的第一个问题是你在最后一行指定一个类型
return struct Array a;
应该只是
return a;
然而,另一个问题是你没有动态分配数组并返回一个指针,所以在这个函数完成之后,a
的值可能会被覆盖,因为它是在堆栈上分配的。试试这个:
Array* foo() {
Array *a = malloc(sizeof(Array));
int i;
initArray(a, 5); // initially 5 elements
for (i = 0; i < 100; i++)
insertArray(a, i); // automatically resizes as necessary
printf("%d\n", a->array[9]); // print 10th element
printf("%d\n", a->used); // print number of elements
freeArray(a);
return a;
}