使用全局指针进行分段错误

时间:2016-12-07 04:15:38

标签: c pointers segmentation-fault global errno

我正在尝试定义一个全局指针变量,然后可以在main函数中真正设置,如下所示。但是,在此之后我尝试使用async void FromFolder() { try { Stream stream = null; var file = await CrossMedia.Current.PickPhotoAsync().ConfigureAwait(true); if (file == null) return; stream = file.GetStream(); file.Dispose(); img.Source = ImageSource.FromStream(() => stream); } catch { } } 时,我会收到分段错误。我知道它可能与在开始时将指针设置为outputName有关...任何关于我如何拥有一个全局指针然后在main中设置的帮助将非常有帮助!以下是我的代码中给出错误的部分:

NULL

2 个答案:

答案 0 :(得分:3)

可能是在outputName设置为非空值之前调用信号处理程序,可以尝试在outputName = argv [2]之后设置信号处理程序;在main()

答案 1 :(得分:2)

仔细阅读 signal(7):由于您的catcher来电printf并非异步信号安全功能,因此您的代码为undefined behavior。此外,您的printf控件字符串不以\n结尾,并且由于 stdout 是行缓冲的,因此不会输出任何内容。首选sigaction(2)signal,并在分配outputName后安装信号处理程序

信号处理程序中使用的全局变量应声明为volatile。因此,请在全球范围内声明您的char* volatile outputName;。然后你可能在处理程序中有if (outputName != NULL) remove(outputName);之类的测试。通常的做法是在信号处理程序中设置一些volatile sig_atomic_t全局标志,并在其他地方测试该标志。

你的程序可能没时间得到任何信号。您可能应该等待一些main函数(例如从 stdin ,或usleep(3),或pause(2)poll(2)读取... )。

当然,使用所有警告和调试信息(gcc -Wall -g)和使用调试器gdb)编译代码;我想调试器watchpoints对于找到你的bug应该非常有用。

您展示的节目可能不会展示任何SEGV。所以你的实际错误很可能在其他地方。

也许使用strace(1)和/或valgrind也可以提供帮助。