0

構造体があり、コンソールからの値に基づいてそのパラメーターを入力する小さなプログラムを作成しました。

#define M 3
struct data {
    char* info;
    int key;
};

void initHash(data* d) {
    int i;
    for(i=0; i<M; i++) {
        d[i].info = " ";
        d[i].key = -1;
    }
}


void printList(data* d) {
    int i;
    for(i=0; i< M; i++) {
        if(strcmp(d[i].info, " ")) {
            printf(" %d %d %s \n", i, d[i].key, d[i].info);
        }
    }
}

int linearProbing() {
    struct data d[M];
    int hashval;
    char* info;
    char str[25];


    initHash(d);
    scanf("%s",&str);
    while(strcmp(str, "end") != 0) {
    d[id].info = str;
    **printf("before reading \n");
    printList(d);
    id++;
    scanf("%s",&str);
    printf("after reading \n");
    printList(d);
    printf("next iter \n");**
    }
    printList(d);
    return true;
}

私の問題は、最初の印刷関数が正しい値を出力する強調表示された行にありますが、入力を取得した後、data.info パラメータは構造体配列のすべての M メンバーの新しい入力値に変更されます。誰かがなぜそうなのか説明できますか?

出力例:

statue
before reading 
 0 -1 statue 
tornado
after reading 
 0 -1 tornado 
next iter 
before reading 
 0 -1 tornado 
 1 -1 tornado 
clown
after reading 
 0 -1 clown 
 1 -1 clown 
next iter 
before reading 
 0 -1 clown 
 1 -1 clown 
 2 -1 clown
4

2 に答える 2

4

入力文字列を各メンバーにコピーするのではなく、d[id].infoそれらのポインターを同じ文字バッファー ( str) に設定し、使用して何度も上書きしています。

つまりd[0].infod[1].info、 などはすべて同じメモリを指しています。

あなたはおそらく言いたいでしょう:

d[id].info = strdup(str);

毎回文字列の新しいコピーを指すようにします。

于 2013-08-21T13:12:54.497 に答える
2

変数がinfo文字列リテラルを指すようにしています。文字列を保存するには、まず次のように十分なストレージを割り当てる必要があります。

info = (char *) malloc(string size * sizeof(char))

次に、を使用して文字列をコピーしますstrcpy

于 2013-08-21T13:17:41.893 に答える