gauss seidel 프로그램을 코딩 중이며 현재 malloc 사용에 문제가 있습니다.malloc 구현시 세그먼트 오류
도와주세요. 내가 여기에 붙어서 가우스 절단을 반복하지 않았다.
오류는 "세그먼트 오류 (코어 덤프 됨)"라고 표시됩니다. 나는 그것이 무엇을 의미하는지 모른다. 코드를 여러 번 검사했지만 오류를 찾을 수 없습니다.
제가 FSCANF로 사용 된 방법과 다를 수 있습니까?
#include <stdio.h>
#include <stdlib.h>
//structure declarations
struct table2 {
int k;
float value;
int row;
int col;
int nextK_row;
int nextK_col;
};
struct table3 {
int index;
int fir;
int fic;
};
//function prototypes
void allocate_memory(int num_unknowns, int num_entries, struct table2 *pTable2, struct table3 *pTable3, float *b, FILE* fInput, FILE* fOutput);
void free_close (FILE* fInput, FILE* fOutput, struct table2 *pTable2, struct table3 *pTable3, float *b);
int main (int argc, char* argv[]) {
//variable declarations
FILE *fInput=NULL;
FILE *fOutput=NULL;
struct table2 *pTable2=NULL;
struct table3 *pTable3=NULL;
int num_unknowns, num_entries;
float *b=NULL;
int i, j, m;
int count1, count2, count3, count4, l;
//check if arguments from user is 3, else error
if (argc!=3) {
printf("Error, the number of arguments should be exactly as needed(three).\n");
return 1;
}
//open input file
fInput = fopen(argv[1], "r");
//check if input file opened successfully
if (fInput == NULL) {
printf("Error. Input file wasn't opened successfully.\n");
return 1;
}
//open output file
fOutput = fopen(argv[2], "w");
//check if output file opened successfully
if (fOutput == NULL) {
printf("Error. Output file wasn't opened successfully.\n");
return 1;
}
//scan no. of unknowns from file and check if successful
count1 = fscanf(fInput, " %d", &num_unknowns);
if (count1 != 1) {
printf("Error, fscanf() did not read number of unknowns successfully.");
//call function to free memory and close files
free_close (fInput, fOutput, pTable2, pTable3, b);
return 1;
}
//scan no. of entries from file and check if successful
count2 = fscanf(fInput, " %d", &num_entries);
if (count2 != 1) {
printf("Error, fscanf() did not read number of entries successfully.");
//call function to free memory and close files
free_close (fInput, fOutput, pTable2, pTable3, b);
return 1;
}
//call function to allocate memory
allocate_memory(num_unknowns, num_entries, pTable2, pTable3, b, fInput, fOutput);
//loop to read values from Table2 and check if it read successfully
for(i=1; i<=num_entries; i++) {
count3 = fscanf(fInput, " %d %f %d %d %d %d", &(pTable2[i].k), &(pTable2[i].value), &(pTable2[i].row), &(pTable2[i]).col, &(pTable2[i].nextK_row), &(pTable2[i].nextK_col));
if (count3 != 6) {
printf("Error, fscanf() did not read table 2 values successfully.");
//call function to free memory and close files
free_close (fInput, fOutput, pTable2, pTable3, b);
return 1;
}
}
//loop to get values from Table3
for(j=1; j<=num_unknowns; j++) {
count4 = fscanf(fInput, " %d %d %d", &(pTable3[j].index), &(pTable3[j].fir), &(pTable3[j].fic));
if (count4 != 3) {
printf("Error, fscanf() did not read table3 values successfully.");
//call function to free memory and close files
free_close (fInput, fOutput, pTable2, pTable3, b);
return 1;
}
}
//loop to get constants from file
for(m=1; m<=num_unknowns ; m++) {
l = fscanf(fInput, " %f", &(b[m]));
if (l != 1) {
printf("Error, fscanf() did not read constant values successfully.");
//call function to free memory and close files
free_close (fInput, fOutput, pTable2, pTable3, b);
return 1;
}
}
//test print
for(i=1; i<=num_entries; i++) {
printf("%d\t", pTable2[i].k);
printf("%f\t", pTable2[i].value);
printf("%d\t", pTable2[i].row);
printf("%d\t", pTable2[i].col);
printf("%d\t", pTable2[i].nextK_row);
printf("%d\t", pTable2[i].nextK_col);
}
printf("\n\n\n");
for(j=1; j<=num_unknowns; j++) {
printf("%d\t", pTable3[j].index);
printf("%d\t", pTable3[j].fir);
printf("%d\t", pTable3[j].fic);
}
printf("\n\n\n");
for(m=1; m<=num_unknowns ; m++) {
printf("%f", b[m]);
}
printf("\n\n\n");
//call function to free memory and close files
free_close (fInput, fOutput, pTable2, pTable3, b);
return 0;
}
//function to allocate memory
void allocate_memory(int num_unknowns, int num_entries, struct table2* pTable2, struct table3* pTable3, float* b, FILE* fInput, FILE* fOutput) {
//allocate memory for table 2
pTable2 = (struct table2*) malloc(24*num_entries);
if (pTable2 == NULL) {
printf("Error, memory allocation for table2 failed.");
//call function to free memory and close files
free_close (fInput, fOutput, pTable2, pTable3, b);
exit(-1);
}
//allocate memory for table 3
pTable3 = (struct table3*) malloc(12*num_unknowns);
if (pTable3 == NULL) {
printf("Error, memory allocation for table3 failed.");
//call function to free memory and close files
free_close (fInput, fOutput, pTable2, pTable3, b);
exit(-1);
}
//allocate memory for constants
b = (float*) malloc(sizeof(float)*num_unknowns);
if (b == NULL) {
printf("Error, memory allocation for matrix B entries failed.");
//call function to free memory and close files
free_close (fInput, fOutput, pTable2, pTable3, b);
exit(-1);
}
return;
}
//function to free allocated memory and close files
void free_close (FILE* fInput, FILE* fOutput, struct table2 *pTable2, struct table3 *pTable3, float *b) {
if (fInput != NULL)
fclose(fInput);
if (fOutput != NULL)
fclose(fOutput);
if (pTable2 != NULL)
free(pTable2);
if (pTable3 != NULL)
free(pTable3);
if (b != NULL)
free(b);
return;
}
비명을지를 필요가 없습니다. – musicmatze
디버거를 사용하여 프로그램을 실행하면 ** 어디에서 ** 충돌하는지 알려줍니다. –
값으로 전달 된 포인터를 잊지 마세요. 원본에 영향을 미치지 않고 스택에 푸시 된 내용에 대한 포인터를 넣습니다. – BLUEPIXY