2015-10-27 178 views
0

我连接到在GTK的信号的函数内,我使用的一个结构,以多个变量传递给该函数初始化结构的成员函数

我想初始化一个char的值这里的功能

内阵列是我的代码至今:

struct new_button_data 
{ 
    char name; 
}; 

static struct new_button_data nb; 
     g_signal_connect(new_button_dialog,"response",G_CALLBACK (add_new_button),&nb); 


void add_new_button(GtkDialog *dialog, gint response_id, gpointer new_button) 
{ 
    if (response_id==-5) //ok button pressed 
    { 
    strcpy(((char *)((struct new_button_data *) new_button)->name) , "test"); 
    } 
} 

I'mm试图分配从GTK控件到new_button->名称的字符数组获得一个字符串,我得到一个segfault作为运行该代码的结果

如何在函数内初始化它的值? 感谢

+1

哪里是“字符数组”?不要只为了好玩而投,但只有当你真的**知道**所有的影响。如果你不这样做,不要投!并启用警告,您的编译器想踢屁股。 – Olaf

+0

另外,这不是*初始化*,它是*赋值*。 –

+0

felix谢谢你的信息,Olaf,我忘记了作为一个数组decellate 你能指点我在哪里可以读到关于铸造的含义? –

回答

2

您试图写入的字段的类型为charstrcpy功能需要char *。你不能只投charchar *,并期望事情发挥作用。

如果你知道一个名字能有多大,你可以将它定义为一个字符数组:

#define NAME_LEN 100 
struct new_button_data 
{ 
    char name[NAME_LEN]; 
}; 

如果您不知道大小,你可以声明为char *,并使用strdup来为它创建的存储和复制字符串:

struct new_button_data 
{ 
    char *name; 
}; 

void add_new_button(GtkDialog *dialog, gint response_id, gpointer new_button) 
{ 
    if (response_id==-5) //ok button pressed 
    { 
    ((struct new_button_data *) new_button)->name = strdup("test"); 
    } 
} 

你需要记住调用freename当你用它做。

+0

是的,那是我在寻找 谢谢 –

1

当你有一个成员

char name; 

你只能保持在struct一个字符。你不能持有一个字符串。

您需要使用

char* name; 

分配内存为name,当你需要存储的名称。

然后,将名称复制到name

struct new_button_data 
{ 
    char* name; 
}; 

然后,

if (response_id==-5) //ok button pressed 
{ 
    (struct new_button_data *) new_button)->name = malloc(5); // Make it large enough 
    strcpy(((struct new_button_data *) new_button)->name , "test"); 
} 

你需要记住调用freename,当你不需要它。