指针显示为(null)

时间:2014-10-03 04:32:11

标签: c linux pointers gcc

我的应用程序在系统A上正常运行但在系统B上运行了段错误。

系统A(Hyper-V vm)

  • Linux System_A 2.6.32-5-686#1 SMP Tue May 15 16:33:32 UTC 2014 i686 GNU / Linux
  • gcc版本4.4.5(Debian 4.4.5-8)
  • 文件系统:ext3

系统B(Raspberry Pi)

  • Linux System_B 3.12.28+#712 PREEMPT Tue Sep 16 15:49:13 BST 2014 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);

..在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

  • 编译
  • 是否有一种方法可以在发生段错误时获得更多信息性的调试输出?

2 个答案:

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