我有一个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:我很安静,确定这个帖子在某处有些重复,但是我没找到它。
答案 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
。