我的应用程序在系统A上正常运行但在系统B上运行了段错误。
系统A(Hyper-V vm)
系统B(Raspberry Pi)
应用程序的目的是使用inotify
跟踪目录中所做的更改。它将元数据保存到(如果不存在则创建)日志文件。但是,在系统B上它甚至没有那么远。
当我运行程序来监视对目录的更改时,它会在尝试找出正在修改哪个文件时崩溃。
我做了一些挖掘工作,似乎没有正确设置文件名指针(我在确定文件是否感兴趣时用作临时文件名持有者)。
最初使用
设置变量char *filename;
在用正在修改的文件名填充之前,我不会以任何其他方式使用该变量。
当我将事件文件名(正在修改的文件)复制到临时变量时,会出现段错误:
strcpy(filename,event->name);
现在,当我添加一些
printf("ignoring %s \n", event->name);
printf("filename = %s \n", filename);
..在strcpy之前所以我可以看到我发现了什么:
在系统A
ignoring .testfile.swp
filename = Hd¤¿Xè|·ðc¤¿ÿÿÿÿô¿~·®
在系统B上
ignoring .testfile.swp
filename = (null)
Segmentation fault
我在这个阶段可以看到的唯一区别是变量'filename'可能没有正确初始化。但也许这没关系,也许我看错了方向。
问题:
我需要在使用strcpy
之前“准备”指针,还是应该这样做?
导致此问题的两个gcc
版本之间是否存在限制?我只是用gcc worklog.c -o worklog
是否有一种方法可以在发生段错误时获得更多信息性的调试输出?
答案 0 :(得分:2)
在复制到filename
之前,您需要分配空间:
filename = malloc(strlen(event->name)+1); // +1 for the null terminator
strcpy(filename, event->name);
答案 1 :(得分:1)
您需要首先分配缓冲区空间,如下所示:
filename = (char *) malloc(sizeof(char)*(strlen(event->name)+1));
strcpy(filename,event->name);