質問編集履歴

3

追加調査内容を追記しました

2022/03/09 17:08

投稿

_fox
_fox

スコア15

test CHANGED
File without changes
test CHANGED
@@ -84,4 +84,30 @@
84
84
 
85
85
  return 0;
86
86
  ```
87
+ 更に追記します。
88
+ jimbeさんにコメントいただいて、
87
89
 
90
+ 仮に配列みたいにスタックしていて、本来はエラー吐きそうな実装だけれども、たまたまうまくいっているだけと考えると、
91
+ ポインタをインクリメントしたり、糖衣構文じゃない配列の値出力の書き方でデータが読み出せるんじゃないかと思って、
92
+ ```C
93
+ //ポインタをインクリメントするパターン
94
+ printf("--%d\n",*(&animal+0));
95
+ printf("--%f\n",*(&animal+1));
96
+ //糖衣構文じゃない配列の書き方
97
+ printf("%d\n",0[&animal]);
98
+ printf("%f\n",1[&animal]);
99
+ ```
100
+ こんな文を追記してみたところ、私の環境では、両方とも11と0.0が出力されました!(びっくり!)
101
+ 確かにこれが動いたということは、スタックフレームで実現されているのかもしれませんね。
102
+
103
+ 更に配列と同じ書き方もしてみましたが、さすがにこちらはエラーが出力されました。
104
+ ```C
105
+  //これは動かない
106
+ printf("%d\n",&animal[0]);
107
+ printf("%f\n",&animal[1]);
108
+ ```
109
+
110
+ 初心者なものでちょっと不安なのですが、
111
+ 基本的には、「C言語の構造体を、メンバ変数の指定なしでPrintfしたりしない。Printfするときは必ずメンバ変数を指定する」という風に覚えておけばいいんですかね?
112
+
113
+ それとも、日常的にprintf("%d,%f\n",animal);的な、メンバ変数を指定しない出力する文を書いたりされますか?

2

新たに分かったことを追記しました(コード2つ目)

2022/03/09 16:44

投稿

_fox
_fox

スコア15

test CHANGED
File without changes
test CHANGED
@@ -49,3 +49,39 @@
49
49
  return 0;
50
50
  }
51
51
  ```
52
+
53
+ 追記します。
54
+ 構造体を配列として宣言して使った場合、メンバ変数を指定せずにPrintfすることはできませんでした。
55
+ ```C
56
+ #include <stdio.h>
57
+
58
+ //構造体の型宣言
59
+ struct student{
60
+ int no; // 学籍番号
61
+ char name[256]; // 氏名
62
+ int year; // 学年
63
+ char s_class[256]; // クラス
64
+ };
65
+
66
+ int main(void){
67
+ int i;
68
+ //構造体の宣言と初期化の代入
69
+ struct student students[4] = {
70
+ {1, "nakano", 1, "c"},
71
+ {2, "ooisi", 2, "b"},
72
+ {3, "okamoto", 1, "a"},
73
+ {4, "minabe", 2, "a"},
74
+ };
75
+
76
+ for(i = 0; i < 4; i++) {
77
+ //結果の出力
78
+       //コメントアウトしているコレは意図通りに要素を表示してくれます↓
79
+ //printf("%d,%s,%d,%s\n", students[i].no, students[i].name, students[i].year, students[i].s_class);
80
+       
81
+      //↓これは同じようにワーニングが出るのですが、実行してもデータは取れませんでした。
82
+    printf("%d,%s,%d,%s\n",students[i]);
83
+ }
84
+
85
+ return 0;
86
+ ```
87
+

1

誤字の修正

2022/03/09 15:40

投稿

_fox
_fox

スコア15

test CHANGED
File without changes
test CHANGED
@@ -1,11 +1,11 @@
1
- こんにちは。こんにちC言語の構造体について質問があります。
1
+ こんにちは。C言語の構造体について質問があります。
2
+ 下記のようなコードを書いて構造体の動作を確認しています。
3
+ 疑問点は、コードの下から3行目と4行目の内容です。
2
4
 
3
- 構造体のポインタについて実験していたら、
4
5
  構造体の実体をPrintfしたら、構造体の先頭にあるメンバ変数の値だけが出力されると思っていたら、
5
6
  メンバ変数が全て出力できました。
6
7
 
7
8
  この動きがよくわからないのですが、
8
-
9
9
  構造体の中身を出力しようとしたときに、
10
10
  具体的なメンバ変数を指定しない場合は、全てのメンバ変数の値が出力される仕様になっているという事なのでしょうか?
11
11