我正在编写一个高斯赛德程序,我目前在使用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;
}
答案 0 :(得分:1)
在此函数调用中:
allocate_memory(num_unknowns, num_entries, pTable2, pTable3, b, fInput, fOutput);
按值传递所有变量。然后在allocate_memory
内部更改这些变量的本地副本。这些更改不会影响main()
中的变量。
您的段错误可能来自于ptable2[i]
中的main()
等,因为pTable2
仍然是NULL
。
要解决此问题,请通过引用传递变量。但是,您的整个free_close
设置非常难看。我建议将所有相关的控制变量放入struct
;并让main()
调用一个包含其余代码的函数,main()
可以在该函数结束后执行释放。
此外,您应该学习如何找出分段错误发生的位置,这是一项有用的技能。如果您没有设置调试器并且现在不想学习它,可以通过在代码中插入输出语句(包括刷新)并运行程序并查看是否出现该输出来“调试”。这样,你可以逐渐缩小到哪一行有问题。
答案 1 :(得分:0)
而不是pTable2 = (struct table2* ) malloc(24*num_entries);
为什么不pTable2 = (struct table2* ) malloc(sizeof (struct table2)*num_entries);