0
struct node {
        ...
        char *name;
        ...
        struct node *next;
};

再帰関数の場合:

head->name = (char *) malloc(sizeof(char));
if (fscanf(fp, "id\t%d\nname\t%s\nmobile\t%lld\n", &head->id, head->name, &head->mobile) > 0) {
    printf("%s\n", head->name);

それは正しいデータを保存します...仮定...

rutvik

abhinav

しかし、データを印刷するとき...

printf("%d\t%s\t%lld\n", head->id, head->name, head->mobile);

1 rutvik 9876655433

2��nav1234567789


しばらくcharポインタを脇に置いておきましょう。コードは構造体でうまく機能します

struct node {
...
char name[10];
...
struct node *next;

};

しかし、私が名前をとるときはそうではありません[20] 、それは長い長い携帯電話の価値に影響を与えます...なぜ??

出力:

1 Rutvik 9876655433

2 Abhinav 578692242758466

578692242758466は予期しないものです。

4

2 に答える 2

3

sizeof(char)文字列の最後にヌルバイトを入れるのに十分な大きさのバイトを割り当てます。これは1バイトです。%s長さに制約のないものを使用して読みます。

これはヒープバッファオーバーフローです。それは通常、不幸につながります。割り当てるデータ量(32、64、4096、その他の数)のバイト数を決定してから、%31sor%63sまたは%4095sorなどのフォーマット文字列を使用してデータを読み込む必要があります。

割り当てが成功したことを確認することを忘れないでください!

キャストのためにあなたを非難する人がいますmalloc()。宣言されていない関数が受け入れられないようなモードでコンパイルする場合は、キャスト全般に大きな問題はありません。

于 2013-03-08T05:51:52.573 に答える
2

この行:

head->name = (char *) malloc(sizeof(char));

1バイトのメモリのみを割り当てます。最大サイズを決定し、その数の文字を割り当てる必要があります。

head->name = (char *) malloc(sizeof(char) * MAXNAME);

次に、構造体を次のように変更することもできます。

struct node {
        ...
        char name[MAXNAME];
        ...
        struct node *next;
};

より良いオプションは、構造体をそのままにして、bufferscanfでファイルから読み取るMAXNAMEサイズを設定してから、名前に十分なスペースを割り当てることです。

// + 1 for the null character at the end
head->name = (char *) malloc(sizeof(char) * (strlen(buffer) + 1)); 
于 2013-03-08T05:50:57.753 に答える