2017-10-26 1 views
0
#include <string> 
#include <cstdlib> 
#include <iostream> 
using namespace std; 

// function prototypes 
string boxOfStars(int w, int h); 
string lineOfStars(int len); 

// function definitions 
string lineOfStars(int len) { 
    string result = ""; 
    for (int j=0; j<len; j++) { 
     result += "*"; 
    } 
    return result; 
} 

string boxOfStars(int w, int h) { 
    string result_1 = lineOfStars(w); 
    for (int i=0; i<h; i++) 
     cout << result_1 << endl; 

    return 0; 
} 

int main() { 

    int width, length; 

    cout << ""Enter a width and length: "; 
    cin >> width >> length; 
    cout << boxOfStars(width, length); 

    return 0; 
} 

이 프로그램의 요령은 boxOfStars() 함수 내에서 lineOfStars() 함수를 호출하는 것입니다.다른 함수를 호출하는 함수와 관련된 C++ 코드의 문제점은 무엇입니까?

프로그램을 실행할 때 "Segmentation fault : 11"오류가 발생합니다.

 
Enter a width and length: 5 5 
***** 
***** 
***** 
***** 
***** 
Segmentation fault: 11 

나는이 모든 것을 인터넷에서 검색하려고 시도했지만 문제를 찾을 수 없습니다.

프로그램이 터미널에서 제대로 실행되지만 각 출력의 끝에서이 오류 메시지가 나타납니다.

누군가 내 코드에서 오류를 설명해 주시겠습니까?

+1

당신은'boxOfStars()'에'0'을 반환합니다. 'boxOfStars()'내부에서'cout'을 사용하여'void'로 만들거나'main()'안에서'return'과'stars' 라인을 포함하는 문자열을 작성하십시오. – cantordust

+2

segfault를 일으키는 문제 외에도'lineOfStars' 함수가 훨씬 더 간단해야합니다. 루프의 문자열에 추가하는 대신 캐릭터와 길이를 허용하는'string' 생성자를'return string (len, '*');와 같이 호출하는 것이 좋습니다. –

+0

@ Ryan : 이것은 디버거를위한 것입니다. 하나를 사용하는 방법을 배우십시오. 당신이 세그 폴트를 찾는데 도움이되었을 것입니다. –

답변

0

cout의 결과는 BoxOfStars이며 0입니다.이 기능은 BoxOfStars 자체가 별에 대해 cout입니다. 코드가 두 배로 증가한 것 같습니다.

4

boxOfStars()의 반환 유형은 0이며, 이는 char* 포인터로 해석됩니다. NULL char* 포인터를 std::string 생성자에 전달하면 정의되지 않은 동작 인 입니다.

boxOfStars()void으로 보내고 main()에는 cout << boxOfStars(...)을 넣지 않으실 수도 있습니다.

+0

'boxOfStars'에서'string'을 리턴하고'main'에서'cout' 만 리턴하는 것이 더 좋을 것이라고 생각합니다. 어쨌든 0을 문자열로 반환하는 것은 좋지 않습니다. –

0

당신이 0를 반환하려는 당신이 그것을이 string 반환 말

string boxOfStars(int w, int h) { 
    /* ... */ 
    return 0; 
} 

할 때. 당신이 쓴 그래서 컴파일러는 같은 당신을 위해 string에 변환을 추가합니다

string boxOfStars(int w, int h) { 
    /* ... */ 
    return (string)0; 
} 

특히이 경우, 0는 널 포인터로 해석됩니다, 그리고 그것은에서 string를 생성하는 생성자를 호출합니다 const char *. 문자열을 읽으려는 null 포인터에 액세스하려고하면 segfault가 발생합니다. 죄송합니다.

관련 문제