나는 힙 손상이 있고 이유를 찾을 수 없습니다. 제발, 도와 줄 수 있니? 나는 내 마음에 오류가있는 코드 조각이있다. 힙 손상이 여기에 생성된다 (아래 설명 참조)힙 손상. C
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"은 글쓰기를위한 파일이다) :
012 3,516,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;
. 여기에 오류가 존재할 수있는 다른 코드가 있습니다.
아래 코드는 programm 시작 부분에 있습니다.
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 컨테이너를 사용하여 힙 손상을 해결할 때 알아 차 렸습니다.
제발, 오류를 찾을 수 있습니까? 내 마음에, 나는 기억을 올바르게 할당한다. 당신이 rowPermutation
에 대한 malloc()
를 호출 할 때
출력시 정확한 오류를 알려주시겠습니까? GDB를 사용하여 무엇인가를 찾으려고 했습니까? 또한 스 니펫이 아닌 전체 기능을 게시 할 수 있습니까? – samoz
접두사 주석 : [선호] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)'x = malloc (N * sizeof (* x))' 'x = (T *) malloc (N * sizeof (T))'로 변환한다. –
프로그램 시작 부분에 오타가있을 수 있습니다. 함수 이름이'getMaxtrix'가 아니라'getMatrix' 일 가능성이 있습니까? – Marlon