私は(初心者として)Cでアプリケーションを作成していますが、可変長配列を含む構造体内で破損したデータを取得するのに苦労しています。cprogramming.comおよびcert.og/secure-codingのフォーラム投稿で説明されている同様の問題を見つけました。正しい解決策を見つけたと思いましたが、そうではないようです。
構造体は次のようになります。
typedef struct {
int a;
int b;
} pair;
typedef struct {
CommandType name;
pair class;
pair instr;
pair p1;
pair p2;
pair p3;
CommandType expected_next;
char* desc;
int size;
pair sw1;
pair sw2;
pair* data;
} command;
問題のあるものは「コマンド」です。「コマンド」の任意のインスタンス(または正しいフレーズ)に対して、異なるフィールドが設定されますが、ほとんどの場合、異なるインスタンスではありますが、同じフィールドが設定されます。
私が抱えている問題は、expected_next、name、sw1、sw2、size、およびdataフィールドを設定しようとしたときです。そして、破損しているのはデータフィールドです。このような構造体にメモリを割り当てています。
void *command_malloc(int desc_size,int data_size)
{
return malloc(sizeof(command) +
desc_size*sizeof(char) +
data_size*sizeof(pair));
}
command *cmd;
cmd = command_malloc(0, file_size);
しかし、結果のcmdを(かなり)印刷すると、データフィールドの中央がランダムなゴミのように見えます。gdbを使用して手順を進めたところ、正しいデータがフィールドに読み込まれていることがわかります。コマンドが破損するのは、コマンドが別の関数に渡されたときだけのようです。このコードは、次のような関数内で呼び出されます。
command* parse(char *line, command *context)
そして、プリティプリントは別の機能で発生します。
void pretty_print(char* line, command* cmd)
私は物事を正しくやっていると思っていましたが、どうやらそうではありませんでした。私が知る限り、私は構造体の他のインスタンスを大丈夫に構築します(そして私はこれのためにそれらのアプローチを複製しました)が、それらには可変長配列が含まれておらず、それらのきれいなプリントはうまく見えます-それは彼らが私に関係しているからです破損している可能性もありますが、破損はそれほど明白ではありません。
私が書いているのは実際にはパーサーなので、コマンドは解析関数(現在の状態を記述し、パーサーに次に何を期待するかについてのヒントを与える)に渡され、次のコマンド(入力「行」から派生)は次のようになります。戻ってきた。「context」は、解析関数の最後でfree-dされ、新しいコマンドが返されます。これは、入力の次の「行」とともに「parse」に戻されます。
なぜこれが起こっているのかについて誰かが何か提案できますか?
どうもありがとう。