我的应用程序在系统A上运行良好,但在系统B上运行错误。
系统A(Hyper-V虚拟机)
Linux系统_A 2.6.32-5-686 1 SMP周二5月13日16:33:32 UTC 2014 i686 GNU/Linux
GCC版本4.4.5(Debian 4.4.5-8)
文件系统:ext3
系统B(覆盆子皮)
Linux系统3.12.28+712抢占9月16日星期二北京时间2014年9月15:49:13 ARMV6L GNU/Linux
GCC版本4.6.3(Debian 4.6.3-14+RPI1)
文件系统:尝试使用ext3和ext4
应用程序的目的是使用inotify跟踪目录中的更改。它将元数据保存到(如果不存在的话将要创建)日志文件。但是,在系统B上甚至没有那么远。
当我运行程序来监视对某个目录的更改时,当它试图确定要修改哪个文件时,它会崩溃。
我做了一些挖掘,似乎没有正确设置文件名指针(在我确定文件是否感兴趣时用作临时文件名持有者)。
变量最初使用

char *filename;

在用正在修改的文件名填充变量之前,我不会以任何其他方式使用该变量。
然后,当我将事件文件名(正在修改的文件)复制到一个临时变量时,它会出现以下错误:
strcpy(filename,event->name);

现在,当我加一些
printf("ignoring %s \n", event->name);
printf("filename = %s \n", filename);

…在看电视之前我看到了:
在系统A上
ignoring .testfile.swp
filename = Hd¤¿Xè|·ðc¤¿ÿÿÿÿô¿~·®

在系统B上
ignoring .testfile.swp
filename = (null)
Segmentation fault

在这个阶段,我能看到的唯一区别是变量“filename”可能没有正确初始化。但也许这无关紧要,也许我找错了方向。
问题:
在使用strcpy之前,我需要“准备”指针吗?还是应该这样做?
两个gcc版本之间是否存在导致此问题的限制?我只是用gcc worklog.c -o worklog编译
当segfault发生时,是否有办法获得更丰富的调试输出?

最佳答案

在复制到filename之前,需要分配空间:

filename = malloc(strlen(event->name)+1); // +1 for the null terminator
strcpy(filename, event->name);

关于c - 指针显示为(空),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26173308/

10-16 23:50