我的结构定义如下:
typedef struct {
int n;
int *n_p;
void **list_pp;
size_t rec_size;
int n_buffs;
size_t buff_size
} fl_hdr_type;
在我的代码中我有一个initlialization函数,它具有以下
fl_hdr_type *fl_hdr;
fl_hdr = malloc(sizeof(fl_hdr_type) + (buff_size_n * rec_size_n));
将那些缓冲区大小传递给函数,以便为缓冲区留出空间。
尺寸通常非常小......100 * 50或类似的东西。此系统上有大量内存来分配它。 我实际上无法发布堆栈跟踪,因为此代码位于另一个网络上,但是从核心文件中的dbx中提取了一些信息:
buff_size_n = 32,rec_size_n = 186
和malloc.c中的stack..line数字
t_splay:861
t_delete:796
realfree: 531
cleanfree:945
_malloc:230
_malloc:186
为什么会失败的任何想法?
答案 0 :(得分:8)
尝试通过valgrind运行程序,查看它报告的内容。在程序的其他部分中,您可能已经损坏了自由列表或者malloc看到的其他内容。
答案 1 :(得分:0)
你需要做的就是这样做。
fl_hdr = malloc(sizeof(fl_hdr_type)); list_pp是void *的动态数组,您需要将其分配给另一个malloc所需的大小。
list_pp只是指向当时堆上分配的其他内容的指针。
如果要使用一个malloc进行分配,则需要将其定义为所需实际类型的数组。编译器需要知道能够执行分配的类型。
如果你要找的是C中的动态数组,then look at this。
答案 2 :(得分:0)
我将你的例子变成了一个程序,并且运行它绝对没有问题。如果你可以编译并运行这个简单的代码(并且它可以工作),那么你已经破坏了程序中其他地方的堆。请运行Valgrind(编辑,建议为User275455,我没有注意到回复)并使用它提供的输出更新您的问题。
修改强>
此外,在分配结构后,请更新您的问题以指示完全您在使用**list_pp
和*n_p
时所做的事情。如果您无法访问valgrind,至少粘贴程序崩溃时glibc打印的整个跟踪。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int n;
int *n_p;
void **list_pp;
size_t rec_size;
int n_buffs;
size_t buff_size;
} fl_hdr_type;
static size_t buff_size_n = 50;
static size_t rec_size_n = 100;
static fl_hdr_type *my_init(void)
{
fl_hdr_type *fl_hdr = NULL;
fl_hdr = malloc(sizeof(fl_hdr_type) + (buff_size_n * rec_size_n));
return fl_hdr;
}
int main(void)
{
fl_hdr_type *t = NULL;
t = my_init();
printf("Malloc %s\n", t == NULL ? "Failed" : "Worked");
if (t != NULL)
free(t);
return 0;
}
答案 3 :(得分:0)
您需要明确地将n_p
和list_pp
分配给相应的抵消。
fl_hdr_type *fl_hdr;
fl_hdr = malloc(sizeof(fl_hdr_type) + (buff_size_n * rec_size_n));
fl_hdr->n_p = fl_hdr+sizeof(fl_hdr_type);
fl_hdr->list_pp = fl_hdr->n_p + (num_n * sizeof(int));
如果你要这样做,我建议把指针放在结构的末尾,而不是中间。不过,我和Romain在一起,建议您使用单独的malloc()
来电,而不是通过一个电话抓住所有内容。