Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

俞佩 asked in 電腦與網際網路軟體 · 1 decade ago

C++執行時出現Segmentation fault

以下C++程式碼在編譯時沒問題 但執行時卻出現Segmentation fault 導致無法執行 到底是哪裡出錯?

#include<iostream>

void nba(int kg[],int b);

void kobe(float m[],int c);

void gasol(int kg[],float m[],float bmi[],int d);

void lakers(int e,int kg[],float m[],float bmi[]);

int main()

{

int a;

int kg[a];

float m[a];

float bmi[a];

cout << "請輸入人數" << endl;

cin >> a;

nba(kg, a);

kobe(m, a);

gasol(kg, m, bmi, a);

lakers(a, kg, m, bmi);

return 0;

}

void nba(int kg[],int b)

{

cout << "請輸入所有體重" << endl;

for(int g=0;g<b;g++)

cin >> kg[g];

}

void kobe(float m[],int c)

{

cout << "請輸入所有身高" << endl;

for(int h=0;h<c;h++)

cin >> m[h];

}

void gasol(int kg[],float m[],float bmi[],int d)

{

for(int j=0;j<d;j++)

bmi[j]=kg[j]/(m[j])*(m[j]);

}

void lakers(int e,int kg[],float m[],float bmi[])

{

for(int k=0;k<e;k++)

{

cout << "共" << e << "個人的資料" << endl;

cout << "第" << k+1 << "筆體重資料:" << kg[k] << "公斤" << endl;

cout << "第" << k+1 << "筆身高資料:" << m[k] << "公尺" << endl;

cout << "第" << k+1 << "筆BMI資料:" << bmi[k] << endl;

}

}

若是因為最後出現兩層{}而導致錯誤 將其刪除後再編譯 則會出現以下情況

003.cpp: In function `void lakers(int, int*, float*, float*)':

003.cpp:41: name lookup of `k' changed for new ISO `for' scoping

003.cpp:39: using obsolete binding at `k'

所以到底是哪裡出了問題 煩請幫忙解答 謝謝

此程式在Open PCMan2007下執行

1 Answer

Rating
  • 1 decade ago
    Favorite Answer

    Segmentation fault通常是因為指標指到不正確的記憶體地址。

    你的代碼問題出現在kg, m, bmi等陣列在宣告時a的值為0,因此這三個陣列大小在宣告大小為0時產生錯誤,這是不正確的。

    先宣告a然後要求用戶輸入a值,再宣告其他三個暫列。

    {

    int a;

    cout << "請輸入人數" << endl;

    cin >> a;

    int kg[a];

    float m[a];

    float bmi[a];

    nba(kg, a);

    kobe(m, a);

    gasol(kg, m, bmi, a);

    lakers(a, kg, m, bmi);

    return 0;

    }

    你的代碼還有一個問題,就是當暫列傳入近次程序時,處理完畢之後並沒有將值再反饋回主程序。解決方法有三:

    1. 將陣列宣告為Global

    2. 次程序將結果反饋回主程序

    3. 次程序陣列傳入時採用pointer reference

Still have questions? Get your answers by asking now.