簡體   English   中英

請解釋為什么這個 C 代碼給我一個分段錯誤?

[英]Please explain why this C code gives me a segmentation fault?

我是一個嘗試學習 C 的初學者。 以下代碼在我運行時給了我一個分段錯誤。 誰能解釋為什么,或者告訴我我的錯誤?

struct frac sum(struct frac f1, struct frac f2);
struct frac {
int *numer;
int *denom;
};
struct frac sum(struct frac f1, struct frac f2) {
struct frac rv;
*rv.numer = (*f1.numer)*(*f2.denom) + (*f2.numer)*(*f1.denom);
*rv.denom = (*f1.denom)*(*f2.denom);
return rv;
}
int main() {
int n = 5;
int d = 10;
struct frac myFrac1 = {&n, &d};
struct frac myFrac2 = {&n, &d};
struct frac myFrac3 = sum(myFrac1, myFrac2);
return 0;
}

“...當我運行它時,代碼給了我一個分段錯誤。誰能解釋原因,或者告訴我我的錯誤”

首先,如果在調試模式下編譯會出現一些事情,如果您能夠看到它們,可能會阻止您遇到 seg-fault,並通過解決每個問題來做出響應:

當我編譯時出現正常警告時:

在此處輸入圖像描述

不初始化變量是程序員(新老)最常被忽略但代價高昂的錯誤之一。 始終初始化。

為什么出現段錯誤 - 在您的原始代碼中,我在運行時看到了這個:

在此處輸入圖像描述
在此處輸入圖像描述

嘗試取消引用未初始化的指針幾乎總是會導致分段錯誤。

只是一些可以解決上述錯誤的建議:
為了在整個示例改編代碼中保持可讀性,使用typedef創建frac_s 以原始帖子的方式使用指針將需要在地方進行動態 memory 分配,這與非指針(即struct成員)一樣好。 因此,請注意使用非指針成員 下面的指針使用僅限於 function arguments 和sum(,,)的返回類型,從而大大簡化了代碼,但需要動態 memory 分配和free() 將以下內容與您的代碼進行比較以查看更改的程度...

typedef struct  {
    int numer;
    int denom;
}frac_s;


frac_s * sum(frac_s *f1, frac_s *f2);

frac_s * sum(frac_s *f1, frac_s *f2) {
    frac_s * rv = calloc(1, sizeof(*rv)) ;
    if(rv)
    {
        rv->numer = (f1->numer)*(f2->denom) + (f2->numer)*(f1->denom);
        rv->denom = (f1->denom)*(f2->denom);
    }
    return rv;
}

int main(void) {
    int n = 5;
    int d = 10;

    frac_s myFrac1 = {n, d};
    frac_s myFrac2 = {n, d};
    frac_s *myFrac3 = sum(&myFrac1, &myFrac2);
    if(myFrac3)
    {
        //use myFracs;
        free(myFracs);
    }

    return 0;
}

程序將在第二行崩潰

struct frac rv;
*rv.numer = (*f1.numer)*(*f2.denom) + (*f2.numer)*(*f1.denom);

因為,您在堆棧中定義 rv 。 rv.number 可以是任何東西。

在大多數情況下,*(rv.numer) 是你不能寫的地方。

嘗試這個

struct frac sum(struct frac f1, struct frac f2);

struct frac {
    int *numer;
    int *denom;
};

struct frac sum(struct frac f1, struct frac f2) {
    struct frac rv;
    rv.numer = (int*)malloc(sizeof(int));
    rv.denom = (int*)malloc(sizeof(int));
    *rv.numer = (*f1.numer)*(*f2.denom) + (*f2.numer)*(*f1.denom);
    *rv.denom = (*f1.denom)*(*f2.denom);
    return rv;
}

int main() {
    int n = 5;
    int d = 10;

    struct frac myFrac1 = {&n, &d};
    struct frac myFrac2 = {&n, &d};
    struct frac myFrac3 = sum(myFrac1, myFrac2);

    return 0;
}

在此處輸入圖像描述

結果是rv.numerrv.denom都指向 100。

暫無
暫無

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

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