C:malloc-function生成的自由临时数组

时间:2015-12-24 00:50:08

标签: c malloc free

我有一个c函数,它使用malloc生成一个int数组。它安静得很好,我认为它的作用并不重要,因为这个问题与它没有任何关系。 (在这种情况下,它计算给定int和base的数字)。我需要在一个函数中暂时使用这个数组,这可能是一个子函数的子函数...(你明白了,点这个函数可以多次使用)并且在返回之前我想自由运行,但它不起作用。这是一个测试代码(它使用qsort对其二进制表示中的数量的int进行排序(是的,我知道可以更直接地计算结果,但重点是我在尝试自由运行时遇到的问题)这里注释掉函数))):

/home/me/anaconda3/envs/myenv/lib/python3.5/site-packages/matplotlib/__init__.py:892: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.
  warnings.warn(self.msg_depr % (key, alt_key))
PS:我很安静,确定这个帖子在某处有些重复,但是我没找到它。

2 个答案:

答案 0 :(得分:1)

此处的关键问题出现在ABW(阵列边界写入)上。在baseString函数中,实际上是在分配相当于1个整数大小的内存,但是它试图像r[1],r[2], r[i]中的数组那样访问它,这导致写入内存,这在技术上并没有#39;属于你。

代码中的代码段对应

int* r=malloc(sizeof(int));
r[0]=base;
r[1]=1; //ABW here
if(base<2){
    r[2]=-1; //ABW here
    return r;
}

   do{
        int ur=u%base;
        r[i]=ur; //ABW here
        u/=base;
        i++;
    }while(u>0);

这可能会导致代码中任何时间点的未定义行为。在你的情况下,它似乎正在影响free,因为内存覆盖可能搞砸了内部簿记的malloc数据和免费实现。

答案 1 :(得分:1)

你的部分问题实际上非常简单。

baseString()函数中,前三行是

int* r=malloc(sizeof(int));
r[0]=base;
r[1]=1;

malloc()动态分配单个int或带有一个元素的数组。 r[1] = 1修改该数组的第二个元素,该元素有一个元素。

结果是未定义的行为。像这样运行数组末尾的常见症状是破坏程序中的内存,例如malloc()free()内部使用的内存来跟踪已分配和已释放的内存。这可以解释你的问题。

确保分配所需的元素数量。例如,如果需要10个元素,malloc(10*sizeof(int))。您需要计算出所需的数量,因为动态数组不会神奇地增长以获得所需的元素数量。

我没有进一步观察,所以可能还有其他问题。但是这个非常明显。

检查malloc()实际上是否成功也是一个好主意。如果失败,则返回NULL