当前位置: 技术问答>linux和unix
关于GTK表格控件中sprintf函数的一个问题
来源: 互联网 发布时间:2016-04-19
本文导语: static void append_item(GtkWidget *widget, gpointer entry) { char *row[3]; int i=2; sprintf(row[0],"%s",gtk_entry_get_text(entry)); sprintf(row[1],"%d",i); /*运行此行前后row[1]均为空指针,不能赋值*/ sprintf(row[2],"%d",gtk_spin_button_...
static void append_item(GtkWidget *widget, gpointer entry)
{
char *row[3];
int i=2;
sprintf(row[0],"%s",gtk_entry_get_text(entry));
sprintf(row[1],"%d",i); /*运行此行前后row[1]均为空指针,不能赋值*/
sprintf(row[2],"%d",gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinbutton)));
gtk_clist_append(GTK_CLIST(ready_list),row);
}
单步调试时发现以上代码中row[1]在一开始就是空指针了,其他2个都是正常的;如果是char *row[4],那么row[4]也是一开始就是空指针。请问应该怎样给row[1]赋值呢?
|
原因是你没有给指针申请内存空间。
char *row[3]
这只是三个指向字符变量的指针。但这三个指针
row[0] row[1] row[2]
并没有指向任何已经申请的空间,所以你往里面写东西结果基本上会是段错误。
你可以变量初始化时申请内存
char[3][10]
也可以自己动态在堆上申请
如
char *row[3]
row[0] = malloc(10);
row[1] = malloc(10);
row[2] = malloc(10);
char *row[3]
这只是三个指向字符变量的指针。但这三个指针
row[0] row[1] row[2]
并没有指向任何已经申请的空间,所以你往里面写东西结果基本上会是段错误。
你可以变量初始化时申请内存
char[3][10]
也可以自己动态在堆上申请
如
char *row[3]
row[0] = malloc(10);
row[1] = malloc(10);
row[2] = malloc(10);
|
对了,你都已经在写gtk了,所以建议你用glib里封装的一些容器,如Gstring以及与这个类相关的函数如g_string_printf
这些东西比较方便,并且能保证你在不现的平台上编译的时候都可以正常通过运行。
这些东西比较方便,并且能保证你在不现的平台上编译的时候都可以正常通过运行。