[英]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.