
typedef struct _info_t{
int xxx;
int yyy;
int zzz;
} info_t;
typedef struct _gData{
int aaa;
int bbb;
info_t infoData[100];
} gData_t;
gData_t gMainData;
質問1
C言語で上記のようなグローバルのデータを作成しようとしています。
gMainDataの中身を初期化するにはどうするのがベストでしょうか?
(特にinfoData[100]の初期化)
質問2
gMainData.infoData[XXX]には info_t型のtmpDataを代入しようとしていますが
gMainData.infoData[XXX] = tmpData;
データがはいっているかどうかはどう判定するべきでしょうか?
質問3
以下のようにポインタを使うのは間違いでしょうか?
typedef struct _gData{
int aaa;
int bbb;
info_t *infoData[100];
} gData_t;
初期化
memset(gMainData.infoData,NULL, 100);
データの代入
*gMainData.infoData[XXX] = tmpData;
データの有無判定
if( gMainData.infoData[XXX] == NULL){
}
No.4ベストアンサー
- 回答日時:
1.初期化
ループでもmemsetでもよいと思います。どれがベストかはケース・バイ・ケースでしょう。
ただしmemsetの第2引数はint型、第3引数はバイト数なので、次のようにするべきです。
memset(gMainData.infoData, 0, 100 * sizeof(info_t));
また、C言語の規格により static 変数を明示的に初期化しなければ全て 0 になるので
static gData_t iniData;
gData_t data;
と定義しておいて
data = iniData;
のように初期化する方法も(一応)あります。
2.データの代入
info_t *infoData[100] は構造体の配列ではなく、ポインタの配列です。
infoData をポインタにするなら、構造体を下のようにすれば
typedef struct _gData {
int aaa;
int bbb;
info_t *infoData[100];
info_t _infoData[100];
} gData_t;
次のように代入することができます。
data._infoData[XXX] = tmpData;
data.infoData[XXX] = &(data._infoData[XXX]);
3.データの有無判定
前述の2のようにすれば
if( gMainData.infoData[XXX] == NULL){
}
でデータを代入済みかどうか判定できます。
もちろんデータを代入していないポインタがNULLであることが前提ですが。
・余談ですが、構造体のタグ名とtypedefする型名は同じでも大丈夫です。例えば
typedef struct info_t{
...
} info_t;
のように。
No.5
- 回答日時:
#3です。
>「データの有無判定」は・・・これはどっちの判定だろう・・・
「データの有無判定」は・・・これはどっちの判定のつもりだろう・・・
です・・・
初期化は私だと次のように書くかな。
static const info_t initialize_data = { .xxx = 1, .yyy = 2, .zzz = 3, };
for (int i = 0; i < sizeof(gMainData.infoData) / sizeof(gMainData.infoData[0]); i++)
gMainData.infoData[i] = initialize_data;
No.3
- 回答日時:
>質問3
>以下のようにポインタを使うのは間違いでしょうか?
ポインタを使うことはいいのですが「初期化」はmemset()の使い方を間違ってますし、「データの代入」はメモリが確保されていません。
「データの有無判定」は・・・これはどっちの判定だろう・・・
No.2
- 回答日時:
「データが入っているかどうかを判定する」ためには, 「データが『入っているとき』と『入っていないとき』とで何かが違う」という状況を作らなければなりません.
データそのもので区別できるならその区別を使えばいいし, そうでなければ「データが入っているかどうかを判定する」ためのデータが必要.

No.1
- 回答日時:
まずは、「普通に」初期化しましょう。
多くの場合、そんなに悪い結果にはなりませんから。
gMainData.aaa = 初期値;
gMainData.bbb = 初期値;
for(i = 0; i < 100; i++)
{
gMainData.infoData[i].xxx = 初期値;
gMainData.infoData[i].yyy = 初期値;
gMainData.infoData[i].zzz = 初期値;
}
あと、
info_t intial_data = {xxx の初期値, yyy の初期値, zzz の初期値};
で、
for(i = 0; i < 100; i++)
{
gMainData.infoData[i] = initial_data;
}
でもいいですが。
ポインタを使ったコードは、そもそも、「データの実体となる領域を確保できてない」時点でアウトです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Run-Time Check Failure #3とい...
-
init関数の意味
-
TCHAR文字列内の検索について
-
#define NULL ((void *)0) の弊害
-
PASCALとFARの意味
-
DelphiでCreateProcessがうまく...
-
参照型で受け取った引数をポイ...
-
C言語の文字列?処理 strcpyやl...
-
printfとscanfの違いって・・・
-
戻り値で構造体を返すことは可...
-
セグメントエラー
-
登録した文字列をランダムに表...
-
【C言語】別関数でポインタの値...
-
constとポインタと引数について
-
popenした子プロセスのプロセス...
-
メモリのアドレスからの値の取...
-
プーさんのマウスポインタを教...
-
ポインタのポインタ
-
B-reps(境界表現)をC、C++で...
-
->記号って?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
参照型で受け取った引数をポイ...
-
トリプルポインタが必須!とな...
-
ハンドルはポインタか
-
LPSTR型の初期化について
-
ポインターの使用法や利点
-
ポインタについて
-
c言語で任意のファイルから読み...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
ハンドル、アドレス、ポインタ...
-
アプリを32bitから64bit移行
-
デバイスハンドルとは?
-
NULLとブランクの違い
おすすめ情報