2016-10-04 9 views
1

私は配列を含む構造体を返すプログラムを作っていますが、配列の要素は完全に間違っています。私はこのサイト、Google、さらにはBingで答えを探し続けています。私は見つけることができる最高は次のように答えている:配列内の正しい要素を持つ配列を含む構造体(関数から)を返すにはどうすればよいですか?

機能は、彼らは、構造体を返すことができ、
しかしC.で配列を返すことはできません。そして、構造体は、配列を含むことができます...今How to make an array return type from C function?

から

は、どのように私は、ポインタを使用せずにこの問題を解決するのですか?

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <ctype.h> 

struct Codes{ 
int as; 
int a[]; 
}; 

struct Codes create(int as){ 
    int a[as]; 
    for(int j = 0;j<as;j++) 
     a[j]=j+1; 
    struct Codes c; 
    c.as = as; 
    c.a[c.as]; 
    for(int i=0; i<as; i++) 
     c.a[i] = a[i]; 

    for(int i=0; i<as; i+=1) 
     printf("%d \n", c.a[i]); 

    return c; 
} 

int main(int argc, char **argv) { 

    struct Codes cd; 
    int as = 4; 
    cd = create(as); 

    for(int i=0; i<4; i+=1) 
     printf("%d \n", cd.a[i]); 

} 

実際の出力:

1 
2 
3 
4 
0 
0 
2 
-13120 

予想される出力:あなたの関数で

1 
2 
3 
4 
1 
2 
3 
4 
+0

説明してください。 –

+0

構造体の宣言で配列のサイズを指定する必要があります。ランタイムパラメータに基づいて可変ではありません –

+0

@MM助けてくれてありがとうございます –

答えて

1

structフレキシブルな値は、ポインタでのみ値によって操作することを意図していません。

戻り値に割り当てる必要がある項目の数と、コピーする必要があるバイト数が分からないため、柔軟なメンバーを持つstructを値で返すことはできません。

は、十分な大きさのmallocを使用して動的メモリであなたのstructを割り当て、それにデータをコピーして、呼び出し側へのポインタを返す:

struct Codes *c = malloc(sizeof(struct Codes)+as*sizeof(int)); 
c->as = as; 
for (int i = 0 ; i != as ; i++) { 
    c->a[i] = i+1; 
} 
return c; 

ポインタを返すために、あなたの関数を変更します。呼び出し元が結果を解放することを確認してください。

+0

テスト済みで素晴らしいです。コードを書いていただきありがとうございます。 –

1

struct Codes create(int as)struct Codes c;がスタックに割り当てられていないので、メモリは一度有効もはやです関数が返す...

...コア構造体が戻り値でコピーされました...しかし可変配列の長さc.aは構造体の一部ではありません(メモリ "trailer"または "footer"です)、戻り値と共にコピーされません。

いずれか:

  1. 構造体を割り当て、struct Codes create(struct Codes *dest, int as)関数に渡します。 OR

  2. 構造体配列のサイズがstruct Codes{ int as; int a[4]; };

幸運に固定します。

+0

テスト済み私は今、理解してくれてありがたいです。 –

関連する問題