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