1

私はプログラムを書いていて、次のループがあります:

while ((c = getchar()) != EOF){
    if (c == '\n'){
        char newword[strlen(word) + 1];
        strcpy(newword, word);
        words[i].key = newword;
        memset(word, '\0', MAXLENGTH);          
        i++;
        j = 0;
    } else {
        word[j++] = c;
    }
}

words構造体の配列はどこにありますか:

struct kvp{
    char *key;
    int line;
};

wordは(サイズの)大きな配列でMAXLENGTHあり、最初のいくつかの値が文字列を構成します。

問題はにありwords[i].keyます。ifステートメント内で(に設定した後にnewword)出力すると、正しい値、つまり、入力された単語と同じ最小サイズの文字列が返されます。ただし、ifステートメントが終了し、whileループの外部に戻ると、完全にランダムなものに変更されます?HBk?

発生している可能性があると思われることが3つあります。

  • strcpy私が思うように行動しません
  • newwordはローカル変数であり、それはどういうわけか物事に影響を及ぼします(正しく聞こえません)
  • 私はまだポインタや構造を正しく理解していません(完全に可能です、私はCを学び始めたばかりです)

何が起こっている?

4

2 に答える 2

4

ブロック内で宣言するnewwordと、ifそのブロックが終了した後にスコープ外になります。永続化する場合は、外側のスコープにメモリを割り当てるか、ヒープに文字列を割り当てる必要がありますmalloc

if (c == '\n')
{
    // newword will persist beyond this block:
    char *newword = malloc(strlen(word) + 1);
    strcpy(newword, word);
    words[i].key = newword;

freeこの割り当てられたブロックを呼び出すか、メモリリークを作成する必要があることに注意してください。後で を呼び出す必要がありますfree(words[i].key)

マーティンの使用の提案はstrdup良いものです。それstrdupは利用可能です。それはあなたのために割り当てを行いますが、free後で行う必要があります。

于 2012-08-14T01:40:14.603 に答える
2

newword はスタックに格納されているため、while ループが実行されるたびに範囲外になります。

メモリを動的に割り当てる必要があります。交換することをお勧めします

char newword[strlen(word) + 1];
strcpy(newword, word);

と:

char * newword = strdup(word);

これにより、メモリが割り当てられ、コンテンツがコピーされます。後で free() を使用してそのメモリをクリーンアップする必要があることに注意してください。そうしないと、メモリ リークが発生します。

于 2012-08-14T01:41:51.527 に答える