2017-04-05 4 views
0

みなさん、こんにちは、私は、この構造体の新しいインスタンスを作成し、この構造体のインスタンスを作成し、アレイの作成

のようにランダムな値を持つ属性を初期化する機能を作成し

struct Test 
{ 
    unsigned char* c_string; 
    unsigned int value; 
}; 

次の構造体を得ました

struct Test* createNewTest(){ 
struct Test *NewInstance = (Test *)malloc(sizeof(Test)); 
NewInstance->value = rand(); 

ここでは、完全に初期化されたインスタンスを作成する関数を作成する必要があります。

struct Test** createNewArray(unsigned int n){ 
}; 

誰でもこの操作を手伝ってもらえますか?私は

まず...そのままあなたの割り当てにあなたに答えを与えることなく、これを説明しようとするつもりだ本当に今ここ

+0

ようこそスタックオーバーフロー! ['malloc()'と 'C 'のファミリーの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+2

'sizeof(Test)' - > 'sizeof(struct Test)' –

+0

ポインタc_stringを乱数に割り当てることで達成しようとしていることが分かりませんが、スマートに見えません。 sizeof(Test)を使用する場合は、構造体の先頭にtypedefを付け、その構造体に名前を追加します。 – SPlatten

答えて

0

開始する方法いけない、あなたはn倍のメモリを割り当てる必要があります。 mallocは任意の金額を割り当てることができるので、番号を計算するだけです。

第2に、同じ初期化を行う必要がありますが、配列の各エントリに対して行う必要があります。そのためにはループが必要です。

ヒント:Cでは、単一インスタンスへのポインタと動的配列へのポインタは区別できません。 ptr->valueptr[0].valueと同じであり、ptr[1].valueは配列の次の要素です。

0

最小例:

#include <stdlib.h> 

#define RANDOM 'a' 

struct box { char content; }; 



// Array of n initialized `box`es 

struct box* new_array(int count) { 
    struct box* arr_ptr = malloc(sizeof (struct box) * count); 

    struct box* ptr = arr_ptr; 
    while (count --) { 
     ptr++ -> content = RANDOM; 
    } 

    return arr_ptr; 
} 



// Array of n pointers to initialized `box`es 

struct box* new_box(void) { 
    struct box* box_ptr = malloc(sizeof (struct box)); 
    box_ptr -> content = RANDOM; 
    return box_ptr; 
} 

struct box** new_ptr_arr(int count) { 
    struct box** arr_ptr = malloc(sizeof (struct box*) * count); 

    struct box** temp = arr_ptr; 
    while (count --) { 
     * temp++ = new_box(); 
    } 

    return arr_ptr; 
} 
+1

[malloc()およびCのファミリの戻り値をキャストしない理由に関する質問](/ q/605845)を読んで理解してください。 –

+0

@ toby-speight http://stackoverflow.com/a/1565552/7090469 – suchtgott

1

それはかなり簡単です。あなたが持っている機能を使用して、

struct Test **array = malloc(n * sizeof *array); 
if (!array) return array; 

をし、各ポインタを割り当てます:まず、あなたがstruct Testnのポインタのための十分なストレージを割り当てる必要があります

for (size_t i = 0; i < n; ++i) 
    array[i] = createNewTest(); 

はそれをすべてのまとめを、あなたは

を取得します
struct Test **createNewArray(size_t n) 
{ 
    struct Test **array = malloc(n * sizeof *array); 
    if (!array) return array; 

    for (size_t i = 0; i < n; ++i) 
     array[i] = createNewTest(); 

    return array; 
} 

対応するfree()機能を忘れずに作成してください。

また、Testへのポインタの配列が本当に必要かどうかを考えてみてください。代わりにTestオブジェクトの配列を使うほうが良いかもしれません。

関連する問題