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

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

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

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

Q&A

解決済

3回答

2075閲覧

C言語でstructの中のstructについて

cs50godyokohama

総合スコア1

C

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

0グッド

0クリップ

投稿2021/06/21 23:10

編集2021/06/21 23:13

前提・実現したいこと

現在C言語の勉強をしており、通常の構造体であれば、構造体変数.メンバで値を取得することができるが
structの中にstructがある構造体の場合はどのように構造体にアクセスすることができるでしょうか?

発生している問題・エラーメッセージ

該当のソースコード

typedef struct person { struct person *parents[2]; char alleles[2]; } person;

試したこと

ポインタを指定して
person *memory = malloc(sizeof(person));
memory->parents[0]のように記述しても値をは取得できなかった。

補足情報(FW/ツールのバージョンなど)

C言語

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

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

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

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

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

guest

回答3

0

memory->parents[0]のように記述しても値をは取得できなかった。

何も代入しなければまともな値は取得できません。そして、struct person *parents[2];となっているように、parentsポインタの配列です。

投稿2021/06/21 23:12

maisumakun

総合スコア145208

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

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

maisumakun

2021/06/21 23:19

何をしたいのかがはっきりしないと、それ以上のコメントはしづらいです。
cs50godyokohama

2021/06/21 23:23

したいこととしては、memory->parents[0]に血液型の値を代入してprintfで表示させたいのですが上の例ですと、memory->parents[0]="A";みたいにすれば値をprintfできるのか気になりました。
maisumakun

2021/06/21 23:25

> memory->parents[0]に血液型の値を代入して 考え自体が適切ではありません。memory->parents[0]に代入できるものは、personへのポインタです。
guest

0

ベストアンサー

まず、仕様を明確にしてください。

回答者は質問者と同じ環境にある……わけじゃないです。

それとプログラムは書いたとおりにしか動きません。

なので、コードだけ見せられても、『何がしたいのか』とかが回答者にはわかりません。

そもそも、そのコードは何をするものでしょうか。

alleles とはなんでしょうか。

ざっと調べてみると、対立遺伝子とやららしいですね。

私は理系じゃないのでわかりませんが。

ざっと見た感じ、A型 = { OA, AA }, B型 = { OB, BB } ……という組み合わせで、
A型同士では AB型は生まれない……とかのやつっぽいですね。

でも alleles は char alleles[2] となっています。

まあ、ダメとは言いませんが、私なら(自分用のソフトとかのように自分が仕様を決める立場にいるなら)
int型で二つのデータを保持します。

1 -> "O"
2 -> "A"
3 -> "B"

とかみたいに。

それと、parentsは、

struct person *parents[2] となっています。

これは、『person構造体のポインタの配列』となります。

ポインタは設定しない初期状態では NULL です。

Javaだといわゆるヌルポが発生する案件(?)です。

つまり、『空のポインタを動かそうとしている』ってことです。

まずは、『構造体の中の構造体を使いたい』ではなく、『まずはポインタの使い方等を学びましょう』です。

そもそもポインタを理解していないから今回の問題に直面するのです。

投稿2021/06/22 06:02

BeatStar

総合スコア4958

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

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

cs50godyokohama

2021/06/23 00:00

https://cs50.harvard.edu/x/2021/labs/5/ ご返信ありがとうございます。 こちらの課題に取り組んでおり、どのように親の血液型を代入するのか分からなかったため質問させていただきました。 構造体ポインタについて理解できていないと認識できたので、もう一度復習したいと思います。
guest

0

C

1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct person { 5 struct person *parents[2]; 6 char blood_type[3]; 7} person; 8 9person* make_person(const char* blood_type) { 10 person* p = (person*)malloc(sizeof(person)); 11 if ( p ) { 12 p->parents[0] = NULL; 13 p->parents[1] = NULL; 14 strcpy(p->blood_type, blood_type); 15 } 16 return p; 17} 18 19void print_person(const person* p) { 20 if ( p != NULL ) { 21 printf("%s father:%s / mother:%s\n", 22 p->blood_type, 23 p->parents[0] ? p->parents[0]->blood_type : "?", 24 p->parents[1] ? p->parents[1]->blood_type : "?" 25 ); 26 } 27} 28 29int main() { 30 person* tara = make_person("AB"); // タラちゃん 31 person* masuo = make_person("A"); // マスオ 32 person* sazae = make_person("B"); // サザエ 33 34 tara->parents[0] = masuo; // タラちゃんのパパはマスオ 35 tara->parents[1] = sazae; // タラちゃんのママはサザエ 36 37 print_person(tara); 38 return 0; 39}

投稿2021/06/22 00:16

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問