C - FSNF 和链表的字符 *


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

在递归函数中:

head->name = (char *) malloc(sizeof(char));
if (fscanf(fp, "idt%dnnamet%snmobilet%lldn", &head->id, head->name, &head->mobile) > 0) {
    printf("%sn", head->name);

它存储正确的数据。。。认为

ru特维克

abhinav

但是当打印数据时。。。

printf("%dt%st%lldn", head->id, head->name, head->mobile);

1 ru特维克9876655433

2��导航1234567789


让我们暂时把char指针放在一边。代码与结构配合良好

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

};

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

输出:

1 Ru特维克9876655433

2 Abhinav 578692242758466

578692242758466出乎意料。

您分配sizeof(char)字节,这是一个字节,对于字符串末尾的空字节来说足够大。您使用长度不受限制的%s进行阅读。

这是一个堆缓冲区溢出;这通常会导致不愉快。您需要决定要分配多少数据(32、64、4096,其他一些数字(字节,然后使用%31s%63s%4095s等格式字符串将数据读取到其中

别忘了检查分配是否成功!

有些人会因为你选了malloc()而斥责你。如果使用不接受未声明函数的模式进行编译,那么通常情况下,强制转换没有太大问题。

此行:

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

仅分配1字节内存。您需要确定最大大小并分配那么多字符:

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

然后,您不妨将结构更改为:

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

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

// + 1 for the null character at the end
head->name = (char *) malloc(sizeof(char) * (strlen(buffer) + 1)); 

相关内容

  • 没有找到相关文章

最新更新