1

これは非常に単純な問題のようですが、どの部分が原因であるかを完全に把握することはできません。基本的に、文字列の配列だけを含む構造体があります

struct command_stream{
  char **tokens;
 };

typedef struct command_stream *command_stream_t;
command_stream_t test;

その後、いくつかの文字列をより短い文字列に解析し、最終的に別の文字列の配列になります

char **words = *array of strings*

単語には必要な正しい情報が含まれています。各要素をループして印刷し、文字列に誤りがないことを確認しました。だから今私はトークンを単語に向けるだけです

test->tokens = words;

しかし、それは私にセグメンテーション違反を与えます。理由はわかりませんが。それらは両方ともポインタなので、明らかな何かを見逃していない限り...

編集:関数は全体としてポインタを返さなければならないので、このように設定されましたが、私は忘れ続けています。しかし、新しいtypedefを作成するだけで、私はそれを持っていると思います

typedef struct command_stream command_stream_s;
command_stream_s new_command_stream;

&new_command_stream;を返すだけです。それは正しく機能するはずですか?new_command_stream自体はポインタではありませんが。

4

2 に答える 2

2

コードの抜粋から、構造体を宣言していないようです。構造体へのポインタを正常に宣言しましたcommand_stream_t test;が、このポインタはまだどこも指していません。

何らかの方法で構造体にメモリを割り当て、testそれを参照する必要があります。例えば:

    command_stream_t test = 
        (command_stream_t) malloc(sizeof(struct command_stream));

このようにして、以下を正常に使用できます。

    test->tokens = words;

あなたが意図したように。

mallocメモリの割り当てにを使用する必要はないことに注意してください。ポインタは、メモリが関連付けられている限り、ローカル/グローバル変数を参照できます(ローカル変数を使用する場合は、その変数の宣言スコープ外でポインタを使用しないでください)。

于 2013-01-18T08:27:45.440 に答える
1
typedef struct command_stream *command_stream_t;
command_stream_t test;

これにより、「テスト」がポインターになります。構造体に割り当てられたメモリがありません。構造体にメモリを割り当て、テストポインタがメモリブロックを指すようにしてから、次のように言って逆参照する必要があります-

test->tokens = words;

これを行う:

typedef struct command_stream command_stream_t;
command_stream_t test;

test.tokens = words;

違いは、command_stream_t がポインター型ではなく、実際の構造体であることです。

于 2013-01-18T08:35:36.560 に答える