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);

它存储正确的数据...假设...

鲁特维克

阿比纳夫

但是当打印数据...

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

1 路特维克 9876655433

2 导航 1234567789


让我们暂时搁置 char 指针。代码与结构配合得很好

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

};

但不是当我取名字[20]时,它会影响long long mobile的价值......为什么?

输出:

1 鲁特维克 9876655433

2 阿比纳夫 578692242758466

578692242758466出乎意料。

4

2 回答 2

3

您分配sizeof(char)字节,这是一个字节,足够大,可以在字符串末尾放置一个空字节。您阅读使用%swhich 不受长度限制。

这是堆缓冲区溢出;它通常会导致不快乐。您需要决定要分配多少数据(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;
};

更好的选择是保持结构不变,buffer使用 scanf 从文件中读取 MAXNAME 大小,然后为名称分配足够的空间:

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