0

Student_name の値を出力しようとすると、null しか返されない理由を理解してもらえますか? 学生の名前、ID、および 2 つのテストを格納するために、C で基本的なハッシュテーブルを実装しています。他のすべては正しく保存されています。何を試しても、student_name を保存できません。ハッシュテーブル自体と、テーブル内に配置する要素を記録する 2 つの構造体があります。文字列が 18 文字を超えることはありません。

int main(){
    char op[1];
    int stu_id[1];
    int exam1[1];
    int exam2[1];
    char * student_name = (char*)malloc(18*sizeof(char));

    struct hashtable * dictionary = malloc(sizeof(struct hashtable));
    dictionary->size = 13;
    dictionary->table = malloc(13*sizeof(struct record *));

    if(dictionary==NULL||dictionary->table==NULL){
        printf("Unable to allocate memory for the dictionary.\n");
        return;
    }

    int i;
    int s = 13;
    while(i<s){
        dictionary->table[i]=NULL;
        i++;
    }

    while(scanf("%s %d %d %d %s", op, stu_id, exam1, exam2, student_name) !=EOF){

        if(*op=='i'){
            printf("Intializing %s\n", *student_name);
            add_item(dictionary, stu_id[0], exam1[0], exam2[0], student_name);
    }
    free(dictionary);
    free(student_name);
    return 0;

}
4

2 に答える 2

1

文字列には常に特殊な終了文字 ( '\0') が含まれている必要があることに注意してください。これは、長さ 1 の文字列 (op配列など) が実際には2文字であることを意味します。

これは、読み込んだときに、実際には配列の境界を超えて書き込んでおり、未定義の動作opにつながることを意味します。のサイズを(少なくとも 2 つに)増やすか、単一の(つまり、配列ではない) として宣言し、書式コードを使用して単一の文字を読み取る必要があります。opchar'%c'

また、整数変数を配列として宣言しないでください。代わり&に、呼び出すときにアドレス取得演算子を使用してください。scanf

char op;
int stu_id;
int exam1;
int exam2;

/* ... */

scanf("%c %d %d %d %s", &op, &stu_id, &exam1, &exam2, student_name)

入力が正しくフォーマットされていない場合に備えて、scanfagainstの戻り値もチェックしないでください。EOFスキャンしたい値の数、あなたの場合は5つと比較してください。

于 2013-09-16T05:57:48.530 に答える
0

add_item() 内の学生レコードにメモリを割り当て、それらを辞書->テーブルに割り当てていると思います。投稿したコードから、レコード自体ではなく、学生レコード構造体へのポインターを保持するためのメモリが割り当てられます。

main() の最後で、「dictionary->table」に割り当てられたメモリを解放する必要があります。

于 2013-09-16T06:18:12.863 に答える