簡體   English   中英

實現 malloc 時出現分段錯誤

[英]Segmentation fault in implementing malloc

我正在編寫 gauss seidel 程序,目前在使用 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;
}

在這個函數調用中:

allocate_memory(num_unknowns, num_entries, pTable2, pTable3, b, fInput, fOutput);

您按值傳遞所有變量。 然后在allocate_memory更改這些變量的本地副本。 這些更改不會影響main()的變量。

您的段錯誤可能來自在main()執行ptable2[i]等,因為pTable2仍然是NULL

要解決此問題,請通過引用傳遞變量。 但是,您的整個free_close設置非常丑陋。 我建議將所有相關的控制變量放入一個struct 並讓main()調用一個包含其余代碼的函數, main()可以在該函數結束后進行釋放。

您還應該學習如何找出發生分段錯誤的位置,這是一項有用的技能。 如果您沒有設置調試器並且現在不想學習它,您可以通過在代碼中插入輸出語句(包括刷新)並運行程序並查看是否出現該輸出來“調試”。 這樣,您可以逐漸縮小到哪一行有問題。

而不是pTable2 = (struct table2* ) malloc(24*num_entries); 為什么不pTable2 = (struct table2* ) malloc(sizeof (struct table2)*num_entries);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM