質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

2834閲覧

typedef structとstructの違い

KKKM

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/16 09:30

C

1#include <stdio.h> 2 3struct { 4 int var; 5}obj , *po; 6 7int main() { 8 po = &obj; 9 obj.var = 100; 10 11 printf("%d" , po->var); 12 13 return 0; 14} 15 16 17typedef struct { 18 int var; 19}obj , *po; 20 21int main() { 22 po = &obj; 23 obj.var = 100; 24 25 printf("%d" , po->var); 26 27 return 0; 28} 29 30コード

typedef で構造体を宣言した場合ではエラーが起きます。

この理由がわかりません。
どなたかわかりやすい解説いただきたく存じます

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/05/16 09:33

それ以前の問題に見えるけど。 typedef を使わなかったらエラーが起きないんですか?
Zuishin

2021/05/16 09:34

ああ、二つのソースを一つにしてるのか。
guest

回答2

0

typedefは、構造体を宣言するものではなく、型を定義するものです。

C

1typedef struct { 2 int var; 3}obj , *po;

これだと、この構造体を表すobjという型と、この構造体へのポインタを表すpoという型を定義していることになります。
なので使い方としては

C

1obj xxx; 2po yyy; 3 4xxx.var = 100; 5 6yyy = &xxx; 7yyy->var = 100;

といった使い方になります。

投稿2021/05/16 09:35

編集2021/05/18 03:54
itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KKKM

2021/05/16 12:30

ご回答ありがとうございます。 po->var = 100; →yyy->var = 100;という解釈でよろしいですか インスタンスを作る前にメンバ変数をいじることはできないのでしょうか。 前者のソースでは インスタンスを作る前にメンバ変数に代入しているようにみえるのですが, 誤りでしょうか。
itagagaki

2021/05/16 12:37

あ、そうです。すみません。yyy->var ですね。 objとpoの違いをあなたに例示するために書いたのであって、もちろんインスタンスが生成されていなくてはなりません。
KKKM

2021/05/16 12:43

ご回答ありがとうございます。 すいません言葉足らずでした。 前者のソースとは私が質問で記載した以下の部分のことです こちらではインスタンスを作らずにメンバ変数に値を代入しているのですが何故問題ないのでしょうか struct { int var; }obj , *po; int main() { po = &obj; obj.var = 100; printf("%d" , po->var); return 0; }
itagagaki

2021/05/16 12:49

そのコードは、別の書き方をすると、 struct _xxx { int var; }; struct _xxx obj ; struct _xxx *po; と同じことです。 struct _xxx obj ; でobjのインスタンスがグローバルに作られていて、 po = &obj; でポインタpoはその存在するインスタンスのアドレスを指すことになります。 なので po->var で obj.var を参照できるわけです。
yumetodo

2021/05/18 03:33 編集

struct { int var; } までが「型名」です。intとかcharとかと同じ型名。なので int a; とおなじく struct { int var; } できるし、 typedef int num; とおなじく typedef struct { int var; } st; できる
itagagaki

2021/05/16 15:28

yumetodoさん、「というより」というのは何を指しておっしゃっていますか?
yumetodo

2021/05/17 14:29

「別の書き方をすると」
itagagaki

2021/05/17 14:38 編集

yumetodoさん KKKMさんの質問は、「なぜこのコードが問題ないのか」です。 それに対して、「そのコードは、別の書き方をすると」~だから問題ないのです、という回答をしています。 yumetodoさんがおっしゃっている内容は正しいことをおっしゃってはいますが、質問への答えになっていない、余談、蛇足なので、「というより」というのは、ずれているというか、おかしいと思います。
yumetodo

2021/05/17 23:21

質問者さんには、何処までが型なのか、typedefの役割はなにかについて一般化ができていない状況だと推測しています。itagagakiさんの回答は極めて正しいのですが、その点を補足することでより理解しやすいのではないかと思ったのです。0から回答を作ってもすでにある2人の回答と多くがかぶるのでその部分だけコメントすれば十分と判断しました。蛇足かどうかは質問者さんが決める問題です。
itagagaki

2021/05/18 00:32

補足であれば補足とおっしゃればよいと思いますが、「というより」は補足ではないですよね。
yumetodo

2021/05/18 03:33

なるほど。ご指摘ありがとうございます。
fana

2021/05/18 03:51

> yyyは当然前もってインスタンスの生成が必要です。 これは, yyy->var = 100; というアクセスよりも前にyyyは有効なインスタンスを指す必要がある,みたいな意味合いなのだろうと思いますが, なんだかぼやっとした文章になっているように思いますし,コード例の方で適当に po yyy = &xxx; とかにしといた方がより明瞭で良いのではないでしょうか.
itagagaki

2021/05/18 03:55

fataさんのおっしゃるとおりだと思いますので回答を修正しました。
guest

0

typedef は変数宣言するキーワードではないです。

そもそもの使い方間違ってます

投稿2021/05/16 09:32

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問