处理错误 - 预期的表达式在C结构之前

处理错误 - 预期的表达式在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; 
} 
+0

'typedef'允许你只是说'数组',你不必总是说'struct Array',那么为什么不与它一致呢? –

+0

'struct array foo()'==>'Array foo()'因为没有'struct Array'。类似于'return struct Array a;'==>'return a;'但更糟糕的是,你似乎正在返回一个你只是'free'd的实体? –

+0

我想补充说,'c'如何处理结构和'C++'如何处理结构之间是有区别的。在'C++'中,你可以互换地使用'struct tag_name'和'tag_name',但是你不能用'c'来做,所以要小心你可能在网上找到的代码示例。 – m0h4mm4d

第一个问题,我看到的是,您指定的最后一行类型

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; 
} 
+0

此外,您可能需要更改'initArray','insertArray'和'freeArray'的实现。 –

+0

返回'struct'没有问题。我没有看到原始代码返回一个*指针*。 –

+0

返回一个指针通常会更好,因为只有8个字节需要传输,当返回一个没有指针的结构时,它必须传输所有的数据。 –