初始化函数内的struct的成员

时间:2015-10-27 19:09:13

标签: c linux gtk

我正在将函数连接到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");
  }
}

我试图将从gtk小部件获取的字符串分配给new_button-> name字符数组,并且由于运行该代码而得到段错误

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

2 个答案:

答案 0 :(得分:2)

您尝试写入的字段属于char类型。 strcpy功能需要char *。您不能仅仅将char投射到char *并希望工作正常。

如果您知道名称有多大,可以将其定义为char数组:

#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");
  }
}

当您完成此操作时,您需要记得在free上致电name

答案 1 :(得分: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");
}

当您不需要free时,您需要记得致电name