C gdk_屏幕_get_default()和get_width()/height()segfault

C gdk_屏幕_get_default()和get_width()/height()segfault,c,gtk,C,Gtk,我刚刚攻破了GTK开发的开放基础,并试图做一些创造性的事情,这对我正在开发的应用程序的未来是有用的 具体来说, int main(int argc, char *argv[]) { GtkWidget *window = NULL, *label = NULL; GdkScreen *screen = NULL; gint width = 0, height = 0; char *resolution = NULL; gtk_init(&argc

我刚刚攻破了GTK开发的开放基础,并试图做一些创造性的事情,这对我正在开发的应用程序的未来是有用的

具体来说,

int main(int argc, char *argv[])
{
    GtkWidget *window = NULL, *label = NULL;
    GdkScreen *screen = NULL;
    gint width = 0, height = 0;
    char *resolution = NULL;

    gtk_init(&argc, &argv);

    if((screen = gdk_screen_get_default()) != NULL)
    {
        width  = gdk_screen_get_width(screen);
        height = gdk_screen_get_height(screen);
    }

    sprintf(resolution, "%d x %d", width, height);

    ...
执行时会导致segfault。我确信我犯了一个noob错误,最终我会认识到错误的所在,但目前我无法找出它。我能够生成的谷歌搜索结果也没有太大用处


有什么帮助吗?

一个问题是变量
resolution
指向NULL,因此sprintf to肯定会导致未定义的行为(可能是崩溃)。代码应该为该变量分配内存(例如,
resolution=malloc(somesize);
),或者在堆栈上声明它(例如,
char resolution[somesize];

Ha。是的,就是这样。非常感谢你。没有错误这个问题是一个很好的例子,说明了为什么你应该总是尝试用一个最小的例子来重现你的问题;您将剥离所有GTK代码,并将问题缩小到
sprintf
。那么您可能已经阅读了
sprintf
上的手册页,并自己找到了答案;-)毫无疑问。我本来只想发布GTK的部分,但这与您描述的相反,只会引起更多的混乱=DWell,当您在发布GTK代码之前测试它时,您会意识到这不是导致segfault的原因;-)精确地我的意思是,我最初的倾向是在你的第一句评论中产生与合理建议相反的结果,哈哈。