user-0 提问: 一个复杂结构体怎么分配空间

回复:
user: user-1
content: 请检查: p_procinparams->p_pgm_pcm_buffers = (dlb_buffer *)malloc(sizeof( dlb )); 是否要改为: p_procinparams->p_pgm_pcm_buffers = (dlb_buffer *)malloc(sizeof( dlb_buffer ));

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令估计不大好调，因为我是写一个接口，调用了很多外部ffmpeg的源代码的函数

user: user-0
content: 引用 10 楼 lovesmiles 的回复:是不是double free还不知道呢，你能不能单步调试？要不就缩减代码，一步步确定加了那一段代码会出错。  这样的错误多数是访问了错误的内存引起的吧。如果bug能百分百重现，耐心一点总能找到原因的。谢谢，能单步调试，我是一溜错改过来的，就是这个时间有点紧

user: user-0
content: 引用 8 楼 xiaohuh421 的回复:你没有调用free, 而又出现free崩溃.  那肯定是ddpi_enc_process内部分配了东西, 但, 由于你外部指定的某些长度不正确, 导致了内部访问越界, 释放的时候就崩溃..  你需仔细阅读ddpi_enc_process函数和 那个结体的说明.有道理假如我malloc时设置了很大的空间会不会这样呢，想排除一下

user: user-2
content: 是不是double free还不知道呢，你能不能单步调试？要不就缩减代码，一步步确定加了那一段代码会出错。  这样的错误多数是访问了错误的内存引起的吧。如果bug能百分百重现，耐心一点总能找到原因的。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令 core文件生成目录好像被我无意间改过一次，请问怎么让它生成在当前目录下啊，现在找不到

user: user-3
content: 你没有调用free, 而又出现free崩溃.  那肯定是ddpi_enc_process内部分配了东西, 但, 由于你外部指定的某些长度不正确, 导致了内部访问越界, 释放的时候就崩溃..  你需仔细阅读ddpi_enc_process函数和 那个结体的说明.

user: user-0
content: 引用 5 楼 xiaohuh421 的回复:p_procinparams->p_pgm_pcm_buffers[0].ppdata = malloc(10 * sizeof(input_buffer));  ppdata 这个东西是一个二级指针 , 可能它是由ddpi_enc_process函数内部分配的, 可能由于某些原因, 比如你操作越界, 导致堆被破坏, 这时free就会崩溃.  你把所有对ppdata操作的地方全部注释掉, 然后再看会不会崩溃就知道了.还是会崩溃，double free，这个二级指针是一个buffer数组，指定输入输出buffer用的

user: user-4
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-3
content: p_procinparams->p_pgm_pcm_buffers[0].ppdata = malloc(10 * sizeof(input_buffer));  ppdata 这个东西是一个二级指针 , 可能它是由ddpi_enc_process函数内部分配的, 可能由于某些原因, 比如你操作越界, 导致堆被破坏, 这时free就会崩溃.  你把所有对ppdata操作的地方全部注释掉, 然后再看会不会崩溃就知道了.

user: user-0
content: 引用 1 楼 lovesmiles 的回复:这样分配空间没有错， 能不能附一下你出错的api?那个东西double free了？你确实是在这个东西出错了吗？那个api的代码看不到的，不过是对的，因为我在写一个接口，肯定是我写的问题

user: user-0
content: 引用 1 楼 lovesmiles 的回复:这样分配空间没有错， 能不能附一下你出错的api?那个东西double free了？你确实是在这个东西出错了吗？ here comes encoder frame ddpi_enc_process failed Audio encoding failed (avcodec_encode_audio2) *** glibc detected *** /home/knight/Desktop/ffmpeg-2.2.2/ffmpeg_g: double free or corruption (out): 0x000000000176b400 *** 中间是一段memory map  Program received signal SIGABRT, Aborted. 0x00007ffff69ba445 in raise () from /lib/x86_64-linux-gnu/libc.so.6

user: user-0
content: 引用 1 楼 lovesmiles 的回复:这样分配空间没有错， 能不能附一下你出错的api?那个东西double free了？你确实是在这个东西出错了吗？ static int dolbydd_encode_frame(AVCodecContext *avctx,AVPacket *pkt,const AVFrame *frame,int *got_packet) {         printf("here comes encoder frame\n");         int err;         ddpi_enc_pgm_status enc_status;         dolbyddAudioContext *s = avctx->priv_data;         dlb_buffer *dlb;         enc_exec *exec;         ddpi_enc_process_ip   *p_procinparams ;         ddpi_enc_process_op   *p_process_op ;         /**********************************************************************************/          p_procinparams = (ddpi_enc_process_ip   *)malloc(sizeof(p_procinparams));         p_process_op = (ddpi_enc_process_op   *)malloc(sizeof(p_process_op));         p_procinparams->p_pgm_pcm_buffers = (dlb_buffer *)malloc(sizeof( dlb ));          if(&(p_procinparams->nsamples) == NULL)         {                 printf("p_procinparams->nsamples == NULL\n");                 return -1;         }          if(p_procinparams->p_pgm_pcm_buffers == NULL)         {                 printf("p_procinparams->p_pgm_pcm_buffers malloc failed\n");                 return -1;         }          int32_t *input_buffer = (int32_t *)frame->data[0];         p_procinparams->p_pgm_pcm_buffers[0].ppdata = malloc(10 * sizeof(input_buffer));          /* initialize buffer descriptor: default to max number of channels */         p_procinparams->p_pgm_pcm_buffers[0].nchannel  = avctx->channels;         /* initialize stride to 0; set to match input files with max chans in loop below */         p_procinparams->p_pgm_pcm_buffers[0].nstride   = 1;         p_procinparams->p_pgm_pcm_buffers[0].ppdata[0] = input_buffer;         p_procinparams->p_pgm_pcm_buffers[0].data_type = DLB_BUFFER_INT_LEFT;         p_procinparams->nsamples = DDPI_ENC_BLKSIZE_MAX ;         p_procinparams->npgms = 1;         pkt->size = sizeof(p_procinparams->nsamples);                 p_process_op->p_status = &enc_status;         int32_t *output_buffer = (int32_t *)malloc(100 * sizeof(p_procinparams->nsamples));  p_process_op->bitstream.ppdata = output_buffer;         p_process_op->bitstream.data_type = DLB_BUFFER_OCTET_UNPACKED;         p_process_op->bitstream.nchannel  = avctx->channels;         p_process_op->bitstream.nstride   = 1;         p_process_op->p_status->p_peak = 181;         p_process_op->noctets = 0;            /* call subroutine API to encode the frameset */         err = ddpi_enc_process                 (s->p_enc                  ,p_procinparams                  ,p_process_op                 );         if(err)         {                 printf("ddpi_enc_process failed\n");                 return -1;         }          pkt->size = p_process_op->noctets;         pkt->data = p_process_op->bitstream.ppdata[0];          pkt->pts  = frame->pts;     return 0; }             这是我整个函数的代码，可能有点长，不过好多是赋值，我不确定是在这出错了，因为还有个初始化函数，我再贴一下调试信息

user: user-2
content: 这样分配空间没有错， 能不能附一下你出错的api?那个东西double free了？你确实是在这个东西出错了吗？