2017-05-08 9 views
-1

この問題を解決しようとすると、最後の6時間はぶらぶらしています。最初は私はCプログラミングの初心者ですので、あまり期待しないでください。 struct内にInteger Arrayを作成するprogrammを書く必要があります。だから私はヘッダーを書き、main以外に "intarray.c"という名前の別のソースファイルを作成しました。私はすべてetcなどを含んでいましたが、構造体の内部にint配列a [n]を作成するために使用される引数 "int n"を取得する関数が必要です。しかし、私はこれを動作させることはできません..私の悪い説明に申し訳ありませんが、私はここで何をしているのか分かりません。私はまた、ポインタで作業を試みたが、それは私を混乱させ、彼らが必要かどうかわからない。C - ソースファイル内に構造体を作成する

私のヘッダは以下のようになります。

#ifndef INTARRAY_H_INCLUDED 
#define INTARRAY_H_INCLUDED 

struct IntArray 
{ 
    int length; 
    int numbers[]; 
}; 
void create(int); 
void destruct(); 
void read(int); 
void write(int, int); 

#endif // INTARRAY_H_INCLUDED 

と私の関数は以下のようになります。

create(int n) 
{ 
    struct IntArray arr; 
    arr.length = n; 
    arr.numbers[n]; 
} 

しかし、今、私は、例えば、他の機能構造を使用することはできません私が特定の位置に配列を書きたい場合。これをどうすれば解決できますか? そして、愚かな質問のために叫んでください。あなたが動的に割り当てる必要が

+3

このスニペットはコンパイルされません。柔軟な配列メンバーと動的メモリ割り当てについて読む。あなたの関数プロトタイプも間違っています。要するに、アロマストではあまりにも多くのエラーは表示されません。あなたのコース教材をまとめるか、良いCの本を手に入れ、チューターにアドバイスを依頼してください。 – Olaf

+1

'struct IntArray * create(int n){struct IntArray * arr = calloc(1、sizeof(* arr)+ n * sizeof(int)); if(arr){arr.length = n; } return arr; } ' – BLUEPIXY

+0

構造体にフレキシブルな配列メンバーがある場合は、配列のサイズを追加できるように' malloc() 'を使って配列を割り当てる必要があります。 – Barmar

答えて

0

メモリ:

struct IntArray 
{ 
    int length; 
    int * numbers; 
}; 

struct IntArray * create(int len) { 
    struct IntArray * ret = malloc(sizeof(struct IntArray)); 
    ret->length = len; 
    ret->numbers = malloc(len * sizeof(int)); 
    return ret; 
} 
0

あなたは、あなたが明示的な構造のためのメモリとシングルとして配列を割り当てる必要が柔軟な配列メンバー(FAM)で作業しています割り当ては、commentBLUEPIXYと示されています。

あなたはまた、コンパイルのコードを記述する必要があります。

struct IntArray *create(int n) 
{ 
    struct IntArray *result = malloc(sizeof(*result) + n * sizeof(result->numbers[0])); 
    if (result != NULL) 
     result->length = n; 
    return result; 
} 

あなたは64ビットシステムであれば、基本的な構造の大きさは、おそらく8つのバイトではなく、あなたが正常に期待4です、これは、コンパイラが4バイトのパディングを追加するように、ポインタを8バイトの境界に揃える必要があるためです。 32ビットシステムでは、フレキシブル配列メンバーのサイズが構造体のサイズに含まれないため、サイズは4になります。

関連する問題