处理错误 - 预期的表达式在C结构之前
我正在尝试使用此线程上建议的代码实现动态数组C dynamically growing array。我想从一个函数返回一个结构数组,但是我在第一行foo()
('struct'之前的错误预期表达式)出现错误。我见过很多其他的例子,但这些解决方案似乎并不适用。我很抱歉,如果其中之一。这里是我的全码:处理错误 - 预期的表达式在C结构之前
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;
}
第一个问题,我看到的是,您指定的最后一行类型
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;
}
此外,您可能需要更改'initArray','insertArray'和'freeArray'的实现。 –
返回'struct'没有问题。我没有看到原始代码返回一个*指针*。 –
返回一个指针通常会更好,因为只有8个字节需要传输,当返回一个没有指针的结构时,它必须传输所有的数据。 –
'typedef'允许你只是说'数组',你不必总是说'struct Array',那么为什么不与它一致呢? –
'struct array foo()'==>'Array foo()'因为没有'struct Array'。类似于'return struct Array a;'==>'return a;'但更糟糕的是,你似乎正在返回一个你只是'free'd的实体? –
我想补充说,'c'如何处理结构和'C++'如何处理结构之间是有区别的。在'C++'中,你可以互换地使用'struct tag_name'和'tag_name',但是你不能用'c'来做,所以要小心你可能在网上找到的代码示例。 – m0h4mm4d