1

構造体の配列の概念を理解しようとしていて、問題が発生しました。うまくいけば、あなたは私を助けることができます.

さて、私が直面している問題は、構造体の配列内で配列変数を宣言して使用する (つまり、値を受け入れて表示する) 方法ですか?

このサンプル コードは、視覚的に問題を理解するのに役立ちます。

#include<stdio.h>

struct node{

    int roll;
    char name[10];
    int grades[5]; // Accepts 5 grades for each student
};

int main()
{
    struct node student[3];

    /*Accept and display values for structure members here*/

    return 0;
}

ここに同様の例があることは知っています。

しかし、受け入れられた回答のセクションの4行目を理解していませんmain()。ここでは、次を使用してメモリが割り当てられていmalloc()ます。

list[ip].inputs[inp]= (char*)malloc(25);

ここで割り当てられた 25 バイトと、で定義された 10 バイトの間で混乱しています。char* inputs[10];

ここで正確に何が起こっているのですか?そして、私が上で述べた問題をどのように解決しますか?

4

3 に答える 3

0

参照された投稿に関する質問に回答するため。

まず、C のポインターに関する基本的な知識があることを願っています。ポインターとは、略してメモリ アドレスです。詳細については、この小冊子 (配列とポインタに関する非常に優れた紹介) をお勧めします。そのコードでは、inputsは として定義されていchar* inputs[10];ます。ポインタの配列です。したがって、その配列の各要素はアドレスでなければなりません。呼び出しの引数25は必要ありません (要件を満たすためにまたはをmalloc指定することもできます)。保証すべき唯一のことは、配列内の各要素がアドレスであることです (それが返されます)。は配列の次元を指定します。つまり、アドレスを合計で格納できます。たとえば、呼び出して配列を初期化できます。4050malloc1010inputsmalloc10 回のように:

struct a;
for (int i = 0; i < 10; i++) {
    a.inputs[i] = (char *) malloc(25);
}

自分の問題に戻ります。あなたの場合、シンボルnameはストレージへのアドレスを識別します。新しいストレージを malloc する必要はありません。

于 2013-08-11T14:09:50.473 に答える