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

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

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

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

Q&A

解決済

2回答

462閲覧

C言語で可変長配列に相当するものを複数のソースコードで利用する方法

kei1224

総合スコア23

C

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

0グッド

0クリップ

投稿2018/01/19 12:31

編集2018/01/19 15:02

###前提・実現したいこと
タイトルのように可変長の配列を複数のソースコードをまたいで利用したいと考えています。
下に記述したコードで例示すると、source_A.cで構造体foo、要素数barの配列を用意し、source_B.cでも利用すると言った流れです。
現状で自分が考えていた手法としては、下のソースコードに記述したようにsouce_A.c内でmalloc()を利用して配列に用いるメモリの動的確保を行いそこへのポインタをexternを利用してsource_B.cでも利用できるようにする。
といった実装を考えていたのですが、実際に実行してみたところSegmentation faultが発生してしまいました。gdbで確認したところexternにしたはずのポインタfoo_tableがsource_B.c内では消えてしまっているようでした。
自分が考えている手法の改善策でも、別の実装案でも問題ありませんので、何らかの解決策があれば教えていただきたいです。

###エラーメッセージ

停止時のエラーメッセージ Program received signal SIGSEGV, Segmentation fault. gdbで確認したfoo_tableのポインタの値 source_A.c内でブレークポイントを設定したfoo_tableのポインタの値 (gdb) p foo_table $2 = (struct foo *) 0x32c60 source_B.c内でブレークポイントを設定したfoo_tableのポインタの値 (gdb) p foo_table $5 = (struct foo *) 0x0

###該当のソースコード
実装しているソースコードは行数が多く、そのままでは載せることが出来ないため関係する部分のみ例という形で記述させていただきます。

C

1// source_A.c 2struct foo *foo_table; 3void function_A(){ 45 struct foo *foo_table = malloc(sizeof(foo) * bar); 67}

C

1// source_B.c 2void function_B(){ 34 printf(test:%s\n, foo_table[0].key); 56}

C

1// source.h 23struct foo { 4 char * key; 5 char * value; 6}; 7 8extern struct foo *foo_table; 9

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

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

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

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

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

kei1224

2018/01/19 15:01

ご指摘ありがとうございます。固定長であればmallocを利用しなくてもextern struct foo[5]のような形で実装できるのではないかと考えたので、その通りの意味のつもりで書いていました。ですが、「可変長配列に相当するもの」のような意味に書き換えないとmallocでの実装を許容しないように取れてしまいますね。修正し、以後気をつけるようにします。
guest

回答2

0

ベストアンサー

こんにちは。

下記では、ローカル変数foo_tableを獲得して、そこにmallocで取ったメモリを設定してます。
グローバル変数のfoo_tableには設定されていませんよ。

C

1void function_A(){ 23 struct foo *foo_table = malloc(sizeof(foo) * bar); 45}

投稿2018/01/19 12:47

Chironian

総合スコア23272

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

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

kei1224

2018/01/19 13:05

回答ありがとうございます! グローバル変数のfoo_tableに代入するように記述を変えることで解決しました! 言われてみれば単純な記述ミスですね…次からは気をつけるようにします。
guest

0

関数function_A()を実行しないで関数function_B()を実行していませんか?

投稿2018/01/19 12:49

shsh_

総合スコア113

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

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

kei1224

2018/01/19 13:01

申し訳ありません。 ソースコード例を簡潔に記述しようとしすぎていたために抜けてしまいましたがfunction_B()は実行しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問