gpt4 book ai didi

c - 堆损坏。 C

转载 作者:行者123 更新时间:2023-11-30 14:26:40 24 4
gpt4 key购买 nike

我有一个堆损坏,但找不到原因。请问,你能帮忙吗?我认为错误所在的地方有一些代码。堆损坏是在此处生成的(请参阅下面的评论):

 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 容器修复堆损坏时我注意到了这一点(只是为了知道为什么数组不同)。

请问你能发现错误吗?在我看来,我正确分配了内存。

enter image description here

最佳答案

当您为 rowPermutation 调用 malloc() 时,N 的值是多少?因为我发现在使用 malloc()< 将内存分配给 rowPermutation 后,您从 fscanf() 获取 N 的值 代表 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com