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);它存储正确的data...suppose..。
鲁特维克
阿希纳夫
但当打印数据..。
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 mobile的价值.为什么??
输出:
1鲁特维克9876655433
2 Abhinav 578692242758466
578692242758466是意想不到的。
发布于 2013-03-08 05:51:52
您分配sizeof(char)字节(即一个字节),足够大到字符串末尾的空字节。您使用的是不受长度限制的%s。
这是堆缓冲区溢出;它通常导致不愉快。您需要决定要分配多少字节(32、64、4096,或其他一些数字),然后使用格式字符串(如%31s、%63s或%4095s或其他任何东西)将数据读入其中。
别忘了检查分配是否成功!
有些人会因为你铸造malloc()而责备你。如果您的编译模式导致未声明的函数不被接受,那么一般的转换都没有什么问题。
发布于 2013-03-08 05:50:57
这一行:
head->name = (char *) malloc(sizeof(char));只分配1字节内存。您需要确定最大大小并分配那么多字符:
head->name = (char *) malloc(sizeof(char) * MAXNAME);那么,您最好将结构更改为:
struct node {
...
char name[MAXNAME];
...
struct node *next;
};一个更好的选择是保持结构的原样,让MAXNAME大小的buffer从文件中读取,然后为名称分配足够的空间:
// + 1 for the null character at the end
head->name = (char *) malloc(sizeof(char) * (strlen(buffer) + 1)); https://stackoverflow.com/questions/15287542
复制相似问题