我正在尝试定义一个全局指针变量,然后可以在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
答案 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。所以你的实际错误很可能在其他地方。