这让我发疯,所以任何帮助都会受到赞赏。
我正在开发一个扫描Wi-Fi接入点并使用不同功能管理它们的程序。其中之一是将访问点列表保存到文件,另一个是从文件中读取访问点并将其添加到当前列表。 接入点存储在链表中,其中'p'包含一个接入点的信息(mac,mode,encrypted,essid等等),'next'是指向下一个节点的指针。
以下是我用来保存的功能的一部分:
void store_info_in_file(list l)
{
list aux;
aux = l;
FILE *file;
..
..
//After opening the file with a name chosen by the user,it traverses
//the list and with casts to char, saves each part of each access point.
//Conversion to char to ease storage in a binary file.
char essid_len = (char)strlen((aux->p).essid);
char enc = (char)(aux->p).encrypted; //originally an int
fwrite(&essid_len,1,1,file);//i'm guessing the size is sizeof(char) now
所有部分都一样。 使用十六进制编辑器分析文件输出,我可以看到数据已正确存储。
这是读取函数的问题部分:(我读取第一个字符[文件中包含的访问点数]并存储它以便以后转换为int。)
//new_apns is for later use, when i will fread the rest of the file at once.
char new_apns;
////wifi_collector_list.c:1103
fread(&new_apns,1,1,fp);
由于读取大小4的无效,导致分段错误。 以下是输出:
“valgrind --leak-check = full --show-reachable = yes --track-originins = yes ./app”
编辑: 我绝对是傻瓜,我写过:
fp = fopen(string,"rb");
if(fp != NULL)
{
//fread here
}
由于某种原因改变为:
if(fopen(string,"rb"))
{
//fread here, so yes, it's null...
}
答案 0 :(得分:3)
==21328== Invalid read of size 4 ==21328== at 0x40D8F35: fread (iofread.c:43) ==21328== by 0x804F043: add_info_from_file (wifi_collector_list.c:1103) ... Address 0x0 is not stack'd, malloc'd or (recently) free'd ^^^
这是fp
NULL
时fread
为fopen
的巨大提示。也许你在{{1}}编辑它时没有检查它?