c++ - 为什么会出现段错误?

标签 c++ gtk char

我的 GTK 程序仍然有问题。

当我点击编码(或解码)按钮时,我收到错误消息:

Segmentation Fault

我认为问题出在函数:retencode 但找不到它。

    //..
    //gets the first argument(buf)
    tx1=gtk_entry_get_text(GTK_ENTRY(entry));
    //...
    //gets the second argument(pass)
    tx2=gtk_entry_get_text(GTK_ENTRY(entry));
    //....
    //signal to callback function encode when button clicked
    g_signal_connect(but,"clicked",G_CALLBACK(encode(tx1,tx2)),NULL);
    // ...
    //convert const char* to char*
    char* ret (const char *bd){
    char *c = new char[12];
    strcpy(c,bd);
    return c;
} 

//encode function
char encode(const char ebuf[],const char epass[]) {
    //This is the complete function I wrote and I am still having the error.
    char *buf=ret(ebuf);
    char *pass=ret(epass);
}

最佳答案

这一行没有意义:

g_signal_connect(but,"clicked",G_CALLBACK(encode(tx1,tx2)),NULL);

你正在调用带有一些参数的 encode(),它返回一个 char 值,(顺便说一句未定义)然后你转换那个 char 进入 GCallback,这是一个指向函数的指针。然后,当单击按钮时,Gtk+ 将尝试调用您的 char,这显然不是有效函数,因此会出现段错误。

不确定你想做什么,但你必须玩by the rules , 并且规则规定 "clicked" 回调应该是一个指向这个原型(prototype)的函数指针:

void f(GtkButton *button, gpointer user_data);

除此之外,你玩得很危险。

前面的示例代码

例如,您想要调用函数 encode 并将 char* 作为参数。你可以这样做:

void clicked_encode(GtkButton *button, gpointer user_data)
{
    char *d = static_cast<char*>(user_data);
    encode(d);
}

并注册回调

g_signal_connect(but, "clicked", G_CALLBACK(clicked_encode), text);

假设 text 指向的内存至少与回调一样长。如果不是这种情况,你制作一个拷贝,但你必须记住释放它:

char *d = strdup(text);
g_signal_connect_data(but, "clicked", G_CALLBACK(clicked_encode), d, free_text, 0);

//and the deleter function
void free_text(gpointer *data, GClosure *)
{
    char *d = static_cast<char*>(data);
    free(d);
}

当然,您的函数中可能需要多个参数,但您只能传递一个指针。解决方案是定义一个包含所有内容的结构(或类,您使用的是 C++):

FancyClass *d = new FancyClass(...);
g_signal_connect_data(but, "clicked", G_CALLBACK(clicked_encode), d, free_fancy_class, 0);

void clicked_encode(GtkButton *button, gpointer user_data)
{
    FancyClass *d = static_cast<FancyClass*>(user_data);
    encode(d);
}

void free_fancy_class(gpointer *data, GClosure *)
{
    FancyClass *d = static_cast<FancyClass*>(data);
    delete d;
}

嘿!您甚至可以使 encode() 成为 FancyClass 的成员函数。可能性是无限的!

我希望这会让你走上正确的轨道......

关于c++ - 为什么会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16658722/

相关文章:

c++ - SDL(和其他)虚拟键输入

rust - 如何在单击按钮事件中执行其他任务时关闭主窗口?

c - 初级C练习【sscanf - fgets - if else】

c - c程序输出中的sizeof

c - 'jpg_name' 可以在此函数中使用未初始化的 [-Werror=uninitialized]

c++ - C++中的默认构造函数如何初始化变量

c++ - 构造函数中的语法不明确

C++ - 链表堆栈运算符重载函数

c - 将数组传递给函数 - 不同的值 - 段错误

memory - 识别导致 strace 挂起的文件