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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

2回答

258閲覧

関数内のデータをmain関数でも使いたい

entio

総合スコア19

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2019/04/20 09:58

c言語のでのプログラミングについての質問です。
関数内で宣言した構造体のデータをmain関数内でも使いたいのですがその方法がわかりません。
ポインタを使うらしいのですがわからず困っています。

構造体宣言
struct aaa
{
char [7]
char [20]
};

メイン関数
main()
{
search(&eee, bbb);
}

search関数
search(char *bbb, struct *ccc)
strukt aaa bbb;
{
}

例えばですがこんな感じです。
seach関数で定義したstruct aaa bbbをメイン関数でも使いたいという話です。
メイン関数内でどう宣言すれば使えるのか教えてほしいです。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

呼び出し側で領域を用意し、そのポインタを引数とする、例を書きました。

c

1/* header.h */ 2struct aaa 3{ 4 char [7] 5 char [20] 6};

c

1/* メインファイル main.c */ 2#include <stdio.h> 3#include <stdlib.h> 4#include "header.h" 5 6int main(void) 7{ 8 struct aaa * eee; 9 struct aaa * bbb; 10 11 eee = (struct aaa)malloc( sizeof(struct aaa)); 12 bbb = (struct aaa)malloc( sizeof(struct aaa)); 13 14 search(eee, bbb); 15 16 free(eee); 17 free(bbb); 18 19 return 0; 20} 21 22search(struct aaa*bbb, struct aaa *ccc) 23{ 24}

投稿2019/04/20 16:49

fu7mu4

総合スコア1088

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

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

entio

2019/04/21 09:27

回答ありがとうございます。 一度malloc関数を使ってやってみようと思います。
cateye

2019/04/22 05:38

BAが出てるけど・・・ malloc()して使った後は必ずfree()を呼んでメモリを開放することを忘れないようにd^^
guest

0

ベストアンサー

seach関数で定義したstruct aaa bbbをメイン関数でも使いたいという話です。

C言語の場合、基本、無理です。
関数内で定義した変数(structも)は、関数を抜けると破棄されます。
従って参照はできません。(厳密には無効なだけなのでしばらくは残るが保証無し)

対応としては、呼び出し側で用意し、そのポインタを引数とする。
または、関数内で、malloc()等によるメモリ確保を行い、そのポインタを返す。
(その場合、後始末が必要。しないとメモリリーク)

[追記]
既に別の方の提示はありますが、、
実際のコードを書いてみました。質問文にあったコードを元にと思ったら、結構、ややこしくなりました。

呼び出し側で用意。

C

1#include <stdio.h> 2 3struct aaaTbl 4{ 5 char name[7]; 6 char desc[20]; 7}; 8 9void search(char *bbb, struct aaaTbl *ccc); 10 11//メイン関数 12main() 13{ 14 char eee[] = "123abc"; 15 struct aaaTbl bbb; 16 17 search(eee, &bbb); 18 printf("result : %s\n", bbb.desc); 19} 20 21void search(char *bbb, struct aaaTbl *ccc) 22{ 23 strcpy(ccc->name, "name"); 24 strcpy(ccc->desc, bbb); 25}

malloc()使用

C

1#include <stdio.h> 2#include <memory.h> 3 4struct aaaTbl 5{ 6 char name[7]; 7 char desc[20]; 8}; 9 10struct aaaTbl *search(char *bbb); 11 12//メイン関数 13main() 14{ 15 char eee[] = "123abc"; 16 17 struct aaaTbl *result = search(eee); 18 19 printf("result : %s\n", result->desc); 20 free(result); 21} 22 23struct aaaTbl *search(char *bbb) 24{ 25 struct aaaTbl *result = (struct aaaTbl *)malloc(sizeof(struct aaaTbl)); 26 27 strcpy(result->name, "name"); 28 strcpy(result->desc, bbb); 29 30 return result; 31}

typedef 使った方が、少しスッキリでした。

投稿2019/04/20 11:48

編集2019/04/21 14:52
pepperleaf

総合スコア6383

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

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

entio

2019/04/21 09:26

回答ありがとうございます。 呼び出し側で用意し、そのポインタを引数とする。 よろしければ、この方法を教えていただけたらなと思います。
entio

2019/04/22 02:57

回答ありがとうございます。 実際に呼び出し側で用意する方法を試したところmain関数内でsearch関数内のデータを使うことができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問