This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center。
已关闭8年。
我有堆损坏,找不到原因。拜托,你能帮忙吗?
我有一些代码段在我心中错误所在的位置。
堆损坏在这里生成(请参阅下面的注释):
因此,内存分配在这里:
}
打开文件:
然后关闭其中一些(“ wFile”是要写入的文件):
更改行顺序:
更改列的顺序:
我需要静态指针才能在我的所有程序中看到它们。
这是另一个可能存在错误的代码:
下面的代码在程序的开头。
我不在程序的其他位置分配内存。
我注意到“ columnsPermutation”数组中的内存已损坏。
首先,我复制一些元素,然后该元素开始更改。我在使用STL容器修复堆损坏时注意到了这一点(只是想知道为什么数组不同)。
请,你能找到一个错误吗?在我看来,我正确分配了内存。
OTOH,最好使用valgrind之类的工具来检查内存泄漏问题。
已关闭8年。
我有堆损坏,找不到原因。拜托,你能帮忙吗?
我有一些代码段在我心中错误所在的位置。
堆损坏在这里生成(请参阅下面的注释):
free(rowPermutation);
fclose(wFile);
因此,内存分配在这里:
static int N = 2,**orderOfRows, *columnsPermutation,*tmpRowPermutation,*resultPermutation,
*u,*v,**sourceMatrix,**patternMatrix,**auxMatrix1,*incidence,*perm;
static FILE *wFile,*file,*patternFile;
void allocate2dMemory() {
int i = 0;
sourceMatrix = (int**) malloc(N * sizeof(int *));
auxMatrix1= (int**) malloc(N * sizeof(int *));
orderOfRows = (int**) malloc(N * sizeof(int*));
patternMatrix = (int**) malloc(N * sizeof(int*));
incidence = (int*) malloc(N * sizeof(int));
columnsPermutation = (int*) malloc(N * sizeof(int));
tmpRowPermutation = (int*) malloc(N * sizeof(int));
resultPermutation = (int*) malloc(N * sizeof(int));
perm = (int*)malloc(N * sizeof(int));
u = (int*) malloc(N * sizeof(int));
v = (int*) malloc(N * sizeof(int));
if ((sourceMatrix == NULL) || (auxMatrix1 == NULL) || (incidence == NULL) || (orderOfRows == NULL) ||
(columnsPermutation == NULL) || (tmpRowPermutation == NULL) || (u == NULL) || (v == NULL) || (resultPermutation == NULL)) {
fprintf(stderr, "out of memory\n");
exit(2);
}
for (i = 0; i < N; i++) {
sourceMatrix[i] = (int*) malloc(N * sizeof(int));
auxMatrix1[i] = (int*) malloc(N * sizeof(int));
patternMatrix[i] = (int*) malloc(N * sizeof(int));
incidence[i] = 0;
if ((sourceMatrix[i] == NULL) || (auxMatrix1[i] == NULL) || (patternMatrix[i] == NULL) ) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}
}
打开文件:
void openFile(char* filename) {
if ((file = fopen(filename, "r")) == NULL) {
perror("Open error");
printf("\nPress any key for exit\n\n");
getch();
exit(1);
}
if ((patternFile = fopen("pattern.dat", "r")) == NULL) {
perror("Open error");
printf("\nPress any key for exit\n\n");
getch();
exit(1);
}
if ((wFile = fopen("out.txt", "w")) == NULL) {
perror("Open error");
printf("\nPress any key for exit\n\n");
getch();
exit(1);
}
然后关闭其中一些(“ wFile”是要写入的文件):
fclose(file);
fclose(patternFile);
更改行顺序:
void changeRowOrder(int *computation,int **matr) {
fprintf(wFile,"Make row permutation\n");
int i,j;
for (i = 0; i < N; ++i) {
orderOfRows[computation[i]] = matr[i];
}
fputs("\n",wFile);
}
更改列的顺序:
int **destMatrix = (int**) malloc(N * sizeof(int *));
if ((destMatrix == NULL)) {
fprintf(stderr, "out of memory\n");
exit(2);
}
for (i = 0; i < N; i++) {
destMatrix[i] = (int*) malloc(N * sizeof(int));
if (destMatrix[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}
for(i = 0; i < N; ++i) {
// save permutation
resultPermutation[perm[i]] = i;
for(j = 0; j < N; ++j) {
destMatrix[i][j] = orderOfRows[i][perm[j]];
}
}
fprintf(wFile,"Now result permutation is: \n");
printArray(resultPermutation);
for(i = 0; i < N; ++i) {
free(sourceMatrix[i]);
}
free(sourceMatrix);
sourceMatrix = destMatrix;
我需要静态指针才能在我的所有程序中看到它们。
这是另一个可能存在错误的代码:
下面的代码在程序的开头。
int res,i,j;
char c[25],f[25],g;
int *rowPermutation = (int*)malloc(N*sizeof(int));
openFile("inb.dat");
fscanf(file,"%s %s %d %d",&c,&f,&N,&i);
allocate2dMemory();
getMaxtrix();
// and so on ...
free(rowPermutation);
fclose(wFile);
我不在程序的其他位置分配内存。
我注意到“ columnsPermutation”数组中的内存已损坏。
首先,我复制一些元素,然后该元素开始更改。我在使用STL容器修复堆损坏时注意到了这一点(只是想知道为什么数组不同)。
请,你能找到一个错误吗?在我看来,我正确分配了内存。
最佳答案
当您为N
调用malloc()
时,rowPermutation
的值是什么?因为我看到使用N
元素为fscanf()
分配内存到rowPermutation
后,您正在从malloc()
中获取N
的值。如果N
未正确初始化,则可能包含垃圾值。
int *rowPermutation = (int*)malloc(N*sizeof(int));
// What is the value of N when executing the above code?
openFile("inb.dat");
fscanf(file,"%s %s %d %d",&c,&f,&N,&i);
// N is obtained after malloc'ing memory to rowPermutation
OTOH,最好使用valgrind之类的工具来检查内存泄漏问题。
关于c - 堆损坏。 C ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8794570/
10-13 07:34