2017-08-05 11 views
0

私はこのスレッドで提案されたコードで動的配列を実装しようとしていますC dynamically growing array。私は関数からstruct 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'は' Array'と言うだけで、常に 'struct Array'と言う必要がなくなります。 –

+0

'struct Array foo()' ==> '配列foo()'は存在しません。同様に、 'return struct Array a;' ==> 'return a;'と同様ですが、もっと悪いことに、単に自由なエンティティを返すように見えますか? –

+0

私は、 'c'がどのようにstructsを扱い、' C++ 'がそれをどう扱うのかに違いがあると付け加えたいと思います。 'C++ 'では、' struct tag_name'と 'tag_name'を同じ意味で使用できますが、' c'で行うことはできませんので、オンラインで見つかるかもしれないコードサンプルに注意してください。 – m0h4mm4d

答えて

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

また、 'initArray'、' insertArray'、および 'freeArray'の実装を変更する必要があるかもしれません。 –

+0

'struct'を返すことに問題はありません。私は元のコードが*ポインタ*を返すのを見ません。 –

+0

ポインタを返すのは、ポインタを持たない構造体を返すときに8バイトしか転送する必要がないため、すべてのデータを転送する必要があるためです。 –

関連する問題