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

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

ただいまの
回答率

91.00%

  • C

    3080questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 150

kei1224

score 2

前提・実現したいこと

タイトルのように可変長の配列を複数のソースコードをまたいで利用したいと考えています。
下に記述したコードで例示すると、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

該当のソースコード

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

// source_A.c
struct foo *foo_table;
void function_A(){
    …
    struct foo *foo_table = malloc(sizeof(foo) * bar);
    …
}
// source_B.c
void function_B(){
    …
    printf(test:%s\n, foo_table[0].key);
    …
}
// source.hstruct foo {
    char * key;
    char * value;
};

extern struct foo *foo_table;
…
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • okrt

    2018/01/19 23:54

    「可変長配列」って書かれたら、mallocで確保する物ではなくて https://ja.wikipedia.org/wiki/%E5%8F%AF%E5%A4%89%E9%95%B7%E9%85%8D%E5%88%97 を思い浮かべる人も多いかもしれません。

    キャンセル

  • kei1224

    2018/01/20 00:01

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

    キャンセル

回答 2

checkベストアンサー

+2

こんにちは。

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

void function_A(){
    …
    struct foo *foo_table = malloc(sizeof(foo) * bar);
    …
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/19 22:05

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/19 22:01

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

    キャンセル

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

  • ただいまの回答率 91.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    ヘッダファイルでの変数の定義について(VC++)

    プログラミング初心者です。 くだらない質問だったらごめんなさい。 環境はWindowsのVisual C++(2015 RC)です。 分割コンパイルのヘッダファイルに

  • 解決済

    DLL内にあるグローバル変数をマルチスレッド間で共有しないようにするには?

    Java上でOggをJavaからDLLを呼び出すJNA経由で再生するために、Oggファイルを再生するDLLを作ろうと、C++とC言語を組み合わせてDLLを作ったのですが、マルチスレ

  • 解決済

    スタックの応用

    スタックを利用して入力された文字列の回文を作るプログラムを作成したら、出力されません。 例えば、「abcd」と入力したら、「abcddcba」と主著力される。 発生して

  • 解決済

    c言語でポインタのsizeofが出したい

    技術的興味からです。 ポインタのsizeを知りたくてpointerをsizeofにかけたのですが出てきませんでした。 char * a ="hoge"; printf(

  • 解決済

    C++ デフォルトコンストラクタについて

    現在、C++の参考書のデフォルトコンストラクタの項目でつまづいています。 以下、参考書からの抜粋 ========== デフォルトコンストラクタは自分で定義しなければ勝手

  • 解決済

    参照渡しとポインタ渡しについて C++ VS2010

    参照渡しとポインタ渡しの違いを教えて下さい。 Visual Studio2010 MFCアプリケーション作成における質問です。 定義した構造体など typedef st

  • 解決済

    C言語のポインタとスタック

    いつもお世話になってます。 C言語のポインタとスタックについて質問です。 現在、C言語でのメモリ領域の使われ方について勉強していたのですが、ポインタとスタックの関係についてわからな

  • 解決済

    C言語 segmentation fault

    C言語の行列の計算です. N*Nの正方行列とN*1のベクトルの掛け算で動的確保の勉強です. Nをとりあえずdefineで定義しているのですが,N=2,4,5あたりは問題なく作動する

同じタグがついた質問を見る

  • C

    3080questions

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