我找到了一个关于python的答案,但我不明白。
这段代码是一个经过修改的合并排序。它在我检查的输入数量很少(最多10个)的情况下运行良好。但是当我通过在线判断运行它时,当输入数量很高(500个)时,它给了我以下错误:
Error in 'a.out': corrupted size vs. prev_size: 0x0000000000d5b8b0
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f3b83a5b7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x80dfb)[0x7f3b83a64dfb]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f3b83a6853c]
a.out[0x4009d1]
a.out[0x400ac7]
a.out[0x400a87]
a.out[0x400aa4]
a.out[0x400a87]
a.out[0x400bc7]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f3b83a04830]
a.out[0x4005b9]
======= Memory map: ========
然后它又运行了15行。为什么我会得到这个错误?是因为我在使用malloc
动态分配内存时犯了一些错误吗?
下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
void *Merge(int *A,int l,int m,int r,int *B,int *F);
void *Merge(int *A,int l,int m,int r,int *B,int *F){
int i=l,j=m,k=0,*C,x,y=l,z,cSize,temp,*D,*E;
cSize = r-l;
C = (int *) malloc (cSize * sizeof(int));
D = (int *) malloc (cSize * sizeof(int));
E = (int *) malloc (cSize * sizeof(int));
while (k < cSize){
if((j==r) || ((i!=m) && ((A[j]*B[i]) >= (A[i]*B[j])))){
C[k] = A[i];
D[k] = B[i];
E[k] = F[i];
i++;
k++;
}
if((i>=m) || ((j!=r) && ((A[j]*B[i]) < (A[i]*B[j])))){
C[k] = A[j];
D[k] = B[j];
E[k] = F[j];
j++;
k++;
}
}
for(x=0;x<k;x++){
A[y] = C[x];
B[y] = D[x];
F[y] = E[x];
y++;
}
free(C);
free(D);
free(E);
}
void *MergeSort(int *A,int left,int right,int *B,int *C);
void *MergeSort(int *A,int left,int right,int *B,int *C){
int mid,i,j,k=0,l=0,*R,*L;
if(right - left == 1){
A[left] = A[left];
}
if(right-left > 1){
mid = (left+right)/2;
MergeSort(A,left,mid,B,C);
MergeSort(A,mid,right,B,C);
Merge(A,left,mid,right,B,C);
}
}
int main(){
int n,i=0,newNumt,newNumo,*a,*b,*c;
scanf("%d",&n);
a = (int *) malloc (n * sizeof(int));
b = (int *) malloc (n * sizeof(int));
c = (int *) malloc (n * sizeof(int));
for(i=0;i<n;i++){
scanf("%d %d",&a[i],&b[i]);
c[i]= i+1;
}
MergeSort(a,0,n,b,c);
for(i=0;i<n;i++){
printf("%d\n",c[i]);
}
return 0;
}
1条答案
按热度按时间6kkfgxo01#
这是一个旧的职位,但有几个问题似乎没有解决,所以下面试图解决一些你在你的职位特别提到。
正如注解中提到的,通过在编译期间设置
-Wall
,然后通过调试器运行它,在提示符下输入多达20组整数对,可以发现导致主要问题的问题的性质。下面是经过几处修改的完整代码。有些只是建议,但有些是对编译警告的响应,有些比其他更重要。这些都是注解。
解决您的一个主要问题:* 为什么会出现此错误?是因为我在使用malloc动态分配内存时犯了错误吗?*:
正如我的@Jonathan Leffler所提到的,这不太可能是内存分配的问题,而是试图访问 * 尚未分配 * 的内存。
与此相关的值得注意的运行时错误是在运行未修改的代码时发现的,并在
Merge()
函数中用注解进行了标记,其中索引k
增加到了一个大于它应该增加的值,导致 * 取消引用越界指针 * 错误。快速修复方法是通过向第二个else
部分添加一个else
,使两个if
部分互斥。但不一定是所需的正确(或唯一)改变。我在代码中没有提到的另一个建议是变量名的选择。正如所写的那样,许多变量名都太晦涩难懂,不能增加代码的可读性或理解代码所要做的事情。建议使用允许其他人(甚至你自己,当3年后你再次看到这个。)立即了解变量的目的是什么。
阅读更改的注解以了解为什么会有这些更改...