0

以下に示すように、構造体要素の配列を作成しようとしています。

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

struct termstr{
double coeff;
double exp;
};

int main(){

termstr* lptr = malloc(sizeof(termstr)*5);

return 0;
}

これをコンパイルすると、次のようなエラーが発生します。

term.c: In function ‘main’:
term.c:11:1: error: unknown type name ‘termstr’
term.c:11:31: error: ‘termstr’ undeclared (first use in this function)

ただし、コードを次のように変更すると、通常どおりコンパイルされます。

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

typedef struct termstr{
double coeff;
double exp;
}term;

int main(){

term* lptr = malloc(sizeof(term)*5);

return 0;
}

typedef (型名を term として) を追加し、struct の名前を termstr に変更し、ポインターの型として term* を使用してメモリを割り当てています。

そのような状況、つまり構造体の配列を作成する場合、typedef は常に必要ですか? そうでない場合、最初のコードでエラーが発生したのはなぜですか? 構造体の単一のインスタンスを作成して使用するには、typedef も必要ですか?

4

7 に答える 7

2

structの前にキーワードを忘れたため、最初のタイプは機能しませんtermstr。あなたのデータ型はstruct termstrただではありませんtermstr。するとtypedef、結果の名前が のエイリアスとして使用されstruct termstrます。

あなたもそうする必要はありません。使用するtypedef方が良いです:

ところで、メモリを解放することを忘れないでください:

typedef を使用する理由をお読みください。

作業コードは次のようになります。

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

struct termstr{
  double coeff;
  double exp;
};

int main(){

struct termstr* lptr = malloc(sizeof(struct termstr)*5);
free(lptr);
return 0;
}
于 2013-06-15T15:00:20.900 に答える
1

そのはず:

struct termstr * lptr = malloc(sizeof(struct termstr)*5);

またはさらに良い:

struct termstr * lptr = malloc(sizeof(*lptr)*5);
于 2013-06-15T14:56:33.850 に答える
1

C では、データ型の名前は "termstr" ではなく "struct termstr" です。

于 2013-06-15T14:57:44.287 に答える
1

次のようなことができます。

typedef struct termstr{
   double coeff;
   double exp;
} termstrStruct;

そしてtermstrStruct、構造体の名前としてのみ使用できます。

termstrStruct* lptr = malloc(sizeof(termstrStruct)*5);

常に必要というわけではなく、単純に と書くことができますstruct termstr

free割り当てられたメモリを忘れないでください!

于 2013-06-15T14:58:07.497 に答える
1

Typedef は、これを短縮する便利な方法です。

struct termstr* lptr = (struct termstr*)malloc(sizeof(struct termstr)*5);

これに:

typedef struct termstr* term;
term* lptr = (term*)malloc(sizeof(term)*5);

malloc をキャストすることもお勧めです。

于 2013-06-15T15:00:26.927 に答える
0

タイプネーム termstr を単独で使用したい場合は、typedef を使用できます。ダブルb; } termstr;

于 2013-06-15T14:59:07.147 に答える
0

C では struct キーワードも追加する必要があるため、typedef を使用してエイリアスを 'struct termsstr' にリンクするか、次のように記述する必要があります。

struct termstr* lptr = malloc(sizeof(struct termstr)*5);

ただし、C++ では、「termstr」として直接参照できます (読み: struct キーワードは不要になりました)。

于 2013-06-15T14:59:11.267 に答える