1

本質的に、このコードは機能しますか?そして、「実行して見てください!」と言う前に、cygwinにgccが付属しておらず、現在、再インストールが完了するまでに40分かかることに気づきました。それは言われています:

char* words[1000];
for(int i = 0; i<1000; i++)
    words[i] = NULL;

char buffer[ 1024 ];

//omit code that places "ADD splash\0" into the buffer

if(strncmp (buffer, "ADD ", 4) == 0){
            char* temp = buffer + 4;
            printf("Adding: %s", temp);
            int i = 0;
            while(words[i] != NULL) i++;
            words[i] = temp;
}

私はその行についてchar* temp = buffer + 4、そして私が自分のやり方で単語[i]を割り当てることができるかどうかについてもほとんど確信がありません。最終的にこれを40分でコンパイルしようとすると、タイプエラーが発生しますか?

また、これが機能する場合、words []の各要素でmalloc()を使用する必要がないのはなぜですか?words[i] = temp単語[i]tempの長さにメモリを割り当てる代わりに、なぜ私は言うことができますか?

4

4 に答える 4

0

char[]char*関数呼び出しとポインタ演算で減衰します。

したがって、一見すると、コードは有効なCです。

編集

word[i] = temp追加した質問は、タイプに互換性があるのでできます。コンパイラーは型の安全性のみをチェックします(まあ、それはもっとたくさんのことをしますが、なぜこれが構文的に有効な代入であるのかという文脈で...)。

于 2012-12-02T22:57:42.063 に答える
0

gccでテストしたところ、動作しますが、c99コンパイラを使用していない限り、forループの外側でiを宣言する必要があります。

于 2012-12-02T23:00:06.573 に答える
0

words[i]すべてがの同じ正確な場所を指すように設定されるため、これはおそらく機能しませんbuffer + 4

ただし、基本的な考え方は問題ありません。同じ基本的な考え方に従うことで、大きなバッファを小さな「単語」に「分割」することができます。ただし、バッファの交差する領域を指していないこと、および単語を指す領域がnullで終了していることを確認する必要があります。

最後に、毎回words[i]次の場所を見つけるために歩くという考えは最適ではありません。最後に書き込んだ場所を保存し、次の書き込みでそれをインクリメントして、ループを削除する必要があります。NULLwhile(words[i] != NULL)

于 2012-12-02T23:05:43.307 に答える
0

あなたの質問の最後の部分に関して-wordsはでありarray of pointers to character strings、書くwords[i] = tempことithはその配列の要素が文字列を指すようにしますtemp

words [i]が指すtempのコピーを作成する必要がない限り、malloc新しいメモリを作成する必要はありません。

于 2012-12-03T00:43:43.563 に答える