1

私はこのような構造体を持っています:

struct students {
    char *names[MAXLENGTH];
};

を使用して構造体を初期化するにはどうすればよいmallocですか?

私は試した

struct students student1 = {malloc(MAXLENGTH * sizeof(char**))};

しかし、それは私に「初期化子の周りに括弧がありません」というエラーを与えました。

私はCが初めてなので、これを修正する方法がわかりません。

4

3 に答える 3

1

これは完全に間違っていますstruct students student1 = {malloc(MAXLENGTH * sizeof(char**))};

このコードを試してください。

struct students* Student1 = malloc(sizeof(struct students ));
Student1->names[0] = malloc(sizeof(NAME_MAX));
scanf("%s",Student1->names[0]);//It may be first name. I think you want like this .
于 2013-04-15T09:18:22.550 に答える
1

次のように構造体のインスタンスを割り当てることができます。

struct students *pStudent = malloc(sizeof *pStudent);

これにより、文字列ポインターの配列が割り当てられますが (の一部であるためstruct students)、ポインターが何かを指すように設定されることはありません (それらの値は未定義になります)。

たとえば、次のように、個々の文字列ポインターを設定する必要があります。

pStudent->names[0] = "unwind";

これは、リテラル文字列へのポインターを格納します。メモリを動的に割り当てることもできます。

pStudent->names[1] = malloc(20);
strcpy(pStudent->names[1], "unwind");

もちろん、malloc()スペースを空ける場合は、それを覚えておく必要がありますfree()。リテラル文字列と動的に割り当てられた文字列を混在させないでください。どの文字列がfree()ing を必要としているかを知ることができなくなります。

于 2013-04-15T09:20:39.670 に答える
0

次のような for ループを使用する必要があります。

#define MAX_NAME_LENGTH 20

struct student s;
for(int i = 0; i < MAXLENGTH; ++i)
{
    s.names[i] = malloc(sizeof(char) * MAX_NAME_LENGTH);
}
于 2013-04-15T09:23:29.323 に答える