繁体   English   中英

使用c malloc函数进行内存分配的意外结果

[英]unexpected results for memory allocation with c malloc function

我必须在多次迭代(6)上为浮点(2D)上的指针分配4个指针的内存,但在第二次迭代时,malloc为两个分配提供了相同的地址。 代码:

int i=0, a=0;
for(i=0;i<6;i++)
{
    float** P_i=(float**) malloc(4*sizeof(float*));
    for(a=0;a<4;a++)    P_i[a]=(float*) calloc(4,sizeof(float));

    for(a=0;a<4;a++)    free(P_i[a]);
    free(P_i);
}

使用gdb进行调试:

(gdb) print i
$42 = 1
(gdb) set $pos=0
(gdb) print P_i[$pos++]
$51 = (float *) 0x804d500
(gdb) print P_i[$pos++]
$52 = (float *) 0x804d148
(gdb) print P_i[$pos++]
$53 = (float *) 0x804d4e8
(gdb) print P_i[$pos++]
$54 = (float *) 0x804d500

P_i [0]和P_i [3]指向相同的地址0x804d500,我找不到原因:/

在第一个(a = 0; a <4; a ++)和第二个(在释放之前)之间

我的猜测是,在最后一次calloc()调用之前,gdb在循环的最后一次迭代中断。 如果是这种情况,P_i [3]具有前一次迭代的地址。

顺便说一句,当每行有多个语句时,很难使用gdb。

有了可用的信息,这是无法回答的,但让我试一试。

代码似乎没问题。 我也无法重现你的问题。

你不能真的把断点放在空行上。 我想这会让它与免费一致。

我的猜测是,你的代码是在启用优化的情况下编译的,这可能会重新排序,确保你不确定执行何时停止。 禁用优化并重新构建(在GCC上将是-O0)。 或者向我们展示反汇编(包括您打印的当前PC)。

我使用-O0 -g构建的Ubuntu gcc(Ubuntu 4.8.4-2ubuntu1~14.04.1)4.8.4上运行,在一行中停止(在执行之前):

(gdb)打印我
$ 1 = 0
(gdb)设置$ pos = 0
(gdb)print P_i [$ pos ++]
$ 2 =(浮动*)0x602040
(gdb)print P_i [$ pos ++]
$ 3 =(浮动*)0x602060
(gdb)print P_i [$ pos ++]
$ 4 =(浮动*)0x602080
(gdb)print P_i [$ pos ++]
$ 5 =(浮动*)0x6020a0
(gdb)bt
malloc.c中的#0 main():12
(gdb)列表
7 for(i = 0; i <6; i ++)
8 {
9 float ** P_i =(float **)malloc(4 * sizeof(float *));
10为(a = 0; a <4; a ++)P_i [a] =(float *)calloc(4,sizeof(float));
11
12为(a = 0; a <4; a ++)free(P_i [a]);

即使您单独构建源代码(不是较大程序的一部分),您的源代码是否也会出现问题? 你有自定义的calloc / malloc吗? “nm your-executable | grep calloc”显示了什么? 它应该是这样的:

U calloc @@ GLIBC_2.2.5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM