C语言结构的malloc异常

时间:2010-04-26 17:22:35

标签: c malloc structure

我的结构定义如下:

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

为什么会失败的任何想法?

4 个答案:

答案 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_plist_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()来电,而不是通过一个电话抓住所有内容。