Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;free():无效的下一个大小(快速)";尝试释放阵列内存时出错_C_Malloc_Free - Fatal编程技术网

C &引用;free():无效的下一个大小(快速)";尝试释放阵列内存时出错

C &引用;free():无效的下一个大小(快速)";尝试释放阵列内存时出错,c,malloc,free,C,Malloc,Free,我正在写一个合并排序变体。在我的任务中,我使用两个数组:arrarray中的键和brrarray中的值。键是整数,值是字符串。合并函数接收这两个数组,l、m和r作为左、中、右索引 void合并(int arr[],char**brr,int l,int m,int r) 我计算两个新阵列的大小,我需要: int size1=m-l+1; int size2=r-m; 为了合并数组,我使用malloc函数为键和字符串创建了两个新数组: int*left=malloc(size1*sizeof(

我正在写一个合并排序变体。在我的任务中,我使用两个数组:
arr
array中的键和
brr
array中的值。键是整数,值是字符串。合并函数接收这两个数组,
l
m
r
作为左、中、右索引

void合并(int arr[],char**brr,int l,int m,int r)
我计算两个新阵列的大小,我需要:

int size1=m-l+1;
int size2=r-m;
为了合并数组,我使用
malloc
函数为键和字符串创建了两个新数组:

int*left=malloc(size1*sizeof(int));
int*right=malloc(size2*sizeof(int));
char**lefts=malloc(size1*sizeof(char*));
char**rights=malloc(size2*sizeof(char*);
然后我从输入数组复制值:

for(int i=0;i
并使用新数组执行排序步骤

i=j=0;
k=l;
而(i
然后我将最后一项添加到
brr
数组中,在尝试释放
权限
数组的内存后,我得到一个错误

free(左);
lefts=NULL;
自由(权利);
权限=空;
注意:尝试释放
lefts
数组的内存时没有错误,只有
rights
。我试图交换
自由(左)
自由(右)
,但结果是一样的

全功能代码:

void合并(int arr[],char**brr,int l,int m,int r){
int size1=m-l+1;
int size2=r-m;
int*left=malloc(size1*sizeof(int));
int*right=malloc(size2*sizeof(int));
char**lefts=malloc(size1*sizeof(char*));
char**rights=malloc(size2*sizeof(char*);
对于(int i=0;i
合并排序功能:

void合并排序(int-arr[],char**brr,int-l,int-r){
if(l
主要内容:

intmain(){
常量int maxStrings=14;
常量int maxStringSize=70;
int n;
scanf(“%d”和“&n”);
getchar();
int*Keys=malloc(n*sizeof(int));
对于(int i=0;i
getStr:

void getStr(字符**a,整数n){
*a=malloc(n*sizeof(char));
字符c;
int i=0;
而((c=getchar())!='\n'&&i
在您的main中,这个:
for(int i=0;i
的最大值应该是
n
,而不是
maxStrings
否?

该错误通常是覆盖不属于您的某些内存的标志。通常,您已经销毁了要释放的变量的“mallocs簿记数据”

因此,寻找非法的内存写入。这个代码怎么样

int *Keys = malloc(n*sizeof(int));
for(int i = 0; i < maxStrings; i++) Keys[i] = i;
int*Keys=malloc(n*sizeof(int));
对于(int i=0;i

您只编写
malloc
元素,但仍然编写
maxStrings
元素。因此,如果
n
小于
maxStrings
,您就有一个写端分配的内存。

您已经向我们展示了正确的代码。现在,您需要做的就是向我们显示出现错误的代码。看见顺便说一句,最好不要将代码分割成单独的片段。只需一个可以复制/粘贴的代码块,就可以让人更容易地尝试您的代码。@Cacahueterito如果大小可能更大,“使用实际数组”不是一个好主意完整的函数代码有可能是正确的。这完全取决于传递给它的参数。最后的
NULL
赋值可以删除。这些都是局部变量,会消失的好吧,似乎很难得到完整的代码。。。现在我们没有
getStr
。无论如何-我99.99%确定您覆盖了一些动态分配内存,从而破坏了
权限的“分配簿记”
顺便说一句:有关可能的答案列表,请参阅,现在它正在工作,但是为什么错误只出现在
权限
数组中?@MaximCheremisinov可能是因为非法写入只破坏了
权限
的簿记,而其他变量没有被触及