我正在使用 GTK ,我不确定 malloc()这里的功能。 Valgrind给我一个内存泄漏,我做得不好? 起初我创建指向指向GTK小部件指针的指针,因为我需要三维数组。
GtkWidget*** widgets;
我正在使用malloc:
widgets = malloc((1)*sizeof(GtkWidget**));
for(i = 0; i<= l-1; i++) // l = 4 in my case
{
widgets[i] = malloc((1)*sizeof(GtkWidget*));
for(j = 0; j<=3; j++) // 4 is number of elements in this dimension
{
widgets[i][j] = malloc((1)*sizeof(GtkWidget));
}
}
最后我这样做了:
widgets[0][0] = gtk_menu_item_new_with_label("MyLabel");
gtk_menu_shell_append(GTK_MENU_SHELL(indicator_menu), widgets[0][0]);
我的数组可以越来越小,所以我使用的是数组的动态分配,我的最大数组索引类似于小部件[3] [3]。 我没有发布整个代码,因为它很长,我发送的只是valgrind抱怨的部分。我做得不好?谢谢。
答案 0 :(得分:1)
当你的意思是分配一个指针数组时,你只是分配一个指针的大小。
// this will allocate a single character pointer
char ** ptr = malloc(1 * sizeof(char *));
// this will allocate n character pointers
char ** ptr = malloc(n * sizeof(char *));
因此,如果你想要一个维度为NxM的二维数组,你需要分配一个大小为N的数组,然后从0到N-1遍历该数组并分配大小为M的数组。
您现在正在做的是将从malloc返回的指针分配给您不拥有的内存。你真的想要一个指向GtkWidget结构的二维数组吗?
答案 1 :(得分:1)
使用l作为局部变量不是一个好主意。在l和1之间犯错是很容易的,在一些编辑器中它们看起来非常相似。
widgets = malloc((l)*sizeof(GtkWidget**)); //is what you needed
iso
widgets = malloc((1)*sizeof(GtkWidget**));
此处语法突出显示问题立即出现。 所以另一个建议是确保使用带语法高亮的编辑器