C言語初心者です。以下のようなtypedefの構造体から関数に配列の値を出したいとき、どのようにすれば良いのでしょうか。
#include <stdio.h>
typedef struct aaa{
int *a; int *b;
}test;
void x(test *tp);
int main(void){
test s[2];
s[1].a=1;
s[2].b=2;
x(&s);
}
void x(test *tp){
int y;
for(y=1;y<=2;y++){
printf("%d\n",tp[y].a);
}
}
上のプログラムで、1,2と表示させたいのですが受け渡し方法がよく分かりません。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
やりたいことが解りませんが、配列の扱いもまだ十分理解できていないのでは?
加えてコンパイル時の警告オプションを増やしてやれば、その警告もプログラム改善のヒントになると思います
やりたいことは次のどちらかだと思うのですが…
#include <stdio.h>
typedef struct aaa {
int a;
int b;
} test;
void x( test *tp );
int main( void ) {
test s[2];
s[0].a = 1;
s[1].a = 2;
x( s );
}
void x( test *tp ) {
int y;
for ( y = 0; y < 2; y++ ) {
printf( "%d\n", tp[y].a );
}
}
/* ---------------------------------------------------------------------- */
#include <stdio.h>
typedef struct aaa {
int a[2];
} test;
void x( test *tp );
int main( void ) {
test s;
s.a[0] = 1;
s.a[1] = 2;
x( &s );
}
void x( test *tp ) {
int y;
for ( y = 0; y < 2; y++ ) {
printf( "%d\n", tp->a[y] );
}
}
No.2
- 回答日時:
同じく何をしようとしているのかさっぱりわからんが....
もろもろやったとしても, 「表示させたい」という「1」「2」が
s[1].a と s[2].b の値
のことだとしたら, for でまわすのは単純ではない. offsetof とかを駆使すればできるのだが, そんなことするよりも
メンバーを配列にする
方が簡単だ.
ちなみにそのプログラムの場合 s と &s は型が違う. 値 (アドレス) は同じだけど.
No.1
- 回答日時:
うーん、何がやりたいか良く分からんのですけど。
>test s[2];
>s[1].a=1;
>s[2].b=2;
・配列の長さが「2」でインデックスは「0」と「1」の筈なのに、インデックスに「1」と「2」を指定する初歩的ミスを犯してる。
>typedef struct aaa{
> int *a; int *b;
>}test;
・構造体でint*としてポインタ型変数を宣言してるが、ポインタ型変数に代入されるのは基本的には「アドレス」である。
なのに、
>test s[2];
>s[1].a=1;
>s[2].b=2;
として「アドレスが代入されるべき変数」に、整数「そのもの」を代入しようとしている。両辺の型が不整合だし、1も2もそのままではアドレスを持たない。
従って、例えば、
int i = 1, j = 2
と変数を宣言しておいて、
test s[2]
s[0].a = &i;
s[1].b = &j
とすべきだろう。
なお、s[0].bとs[1].aには何も代入されていない。
> x(&s);
xの定義は
void x(test *tp);
で、どっちみちsは配列なので、先頭アドレスがxに手渡される。
従って、&sで手渡すのは間違い。
x(s);
で充分である。
> printf("%d\n",tp[y].a);
この辺は最終的にはどーしよーもない。
まず、tp[y].aはポインタなので持ってる値は「アドレス」である。が、これは書式指定の%dでは出力出来ない。恐らくコンパイル時にWarningが出るか、あるいは、コンパイル済バイナリを走らせると素っ頓狂な値が表示される。
まず最初は
printf("%d\n", *tp[y].a);
にする。
ポインタのクソ困ったトコは、宣言の時の*は「アドレスだよ〜ん」って言ってるのに、使用の際の*は「ポインタが指すアドレスに入ってる値」を意味してて、*が無い時には「アドレス」だ、と言う事。ぶっちゃけ、意味が真逆である。ポインタ周りの文法が破綻してるのがCが芯から腐ってる辺りだ。
つまり、使用時の、
tp[y].a
はアドレスを意味してて、%dは受け付けない。逆に
*tp[y].a
にすれば、tp[y].aが指すアドレスに書き込まれた値が表示される。
ただ、そこを直しても問題は解決しない。恐らくセグメンテーションフォールトが起こる。略してセグフォだ。
と言うのも、さっき書いた通り、s[1].aは何も代入されてないので、指し示すトコがない。いわゆるヌルポインタである。2ch(現5ch)的に言うと「ぬるぽ」だ。
当然%dと言う書式設定はヌルポインタの出力は受け付けない。元々欠けてる情報はどうしようもない。
単にエラーを出したくない、ってだけなら、
printf("%p\n", tp[y].a);
が一番無難かもしんない。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
typedef enumの使い方を教えて...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
VC6でlong longでエラー?
-
int void (main)の意味・・・
-
intとINTの違いは?
-
C++ クラスをメンバにもつクラ...
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
引数で argc argvが使用され...
-
C++でboolにintの値を代入する...
-
ハンドルされていない例外が発...
-
直接アドレス指定のポインタの...
-
inline
-
C言語での方向キー入力判定
-
void func( void )について
-
【#define】 defineで定義した...
-
C言語の<ctype.h>のisspace()に...
-
C言語のコンパイルエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
構造体の要素すべてに対する四...
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
関数の実体定義にヘッダファイ...
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++でboolにintの値を代入する...
-
構造体の宣言でエラーが出ます。
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
C言語 宣言した変数になにも代...
-
0除算を判定したい
おすすめ情報