2012-12-26 2 views
1

일부 코딩 작업을했는데 세그멘테이션 오류가 발생했습니다. 나는 그것이 작동하도록 최선을 다했으나 실패했습니다. 이제 저는 도움을 청합니다. 이것은 내 코드입니다 :C++ 프로그램이 세분화 오류를 가져옵니다

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 

    string symbols = "ABCDEFGHIJKLMNOPRSTUVYZ_"; 

    int sim, a = 0; 

    sim = symbols.size(); 

    string temp[sim]; 

    while(sim > 0) 
    { 
    sim--; 

    temp[sim] = symbols.substr(sim, 1); 

    cout << temp[sim] << endl; 
    } 

} 

글쎄,이 작품은 잘 작동하지만 약간 변경하면 충돌이 발생합니다.

나는 변경 :

while(sim > 0) 
    { 
    sim--; 

    temp[sim] = symbols.substr(sim, 1); 

    cout << temp[sim] << endl; 
    } 

이 사람 :

while(a < sim) 
    { 
    a++; 

    temp[a] = symbols.substr(a, 1); 

    cout << temp[a] << endl; 
    } 

내가 SIGFAULT를 얻을

, 내가 정말 잘못 이해하지 않습니다. 디버거를 사용했는데 실제로 충돌하는 줄을 표시하지 않습니다. 단지 다음을 보여줍니다.

프로그램 수신 신호 SIGSEGV, 세그먼트 오류. temp이 유효 인덱스를 sim-1-0을 가지고 있지만, 당신은 즉시 증가, 그래서 sim이되고, 다음 temp[a]에 액세스 - __gnu_cxx::__exchange_and_add(int volatile *, int)()()

+0

프로그램의 어느 시점에서 충돌이 발생했는지 알고 있습니까? (처음 실행하려고 할 때, 끝날 때 등) – Daniel

+1

정확성을 위해 "segfault"라는 철자가 붙어 있습니다. "segmentation fault"의 줄임말. 시그 (SIG)는 특정한 의미를 지니고 있습니다. 즉, 그 값은 신호를 나타내는 상수입니다. 이 경우 철자가 "SIGSEGV"입니다. 하나 또는 다른 것이 적절하지만 나중에 다소 선택해야합니다. – cHao

+0

cHao -> 좋아요. 다음 번에 바로 할게요 ... 해결해 주셔서 감사합니다. 루프의 끝까지 그것은 잘 작동합니다, 고마워요 :) – iCoRe

답변

1

에서

a == sim-1 무슨 생각.

언어 확장 - 즉 VLA -을 제안하고 대신 std::vector을 사용하십시오.

0

임시 직원 [a]는 1에서 sim (포함)까지의 지수로 표시됩니다. 임시 배열은 thay 배열에 대한 유효한 색인이 0에서 sim-1까지 포함한다는 것을 의미하는 sim 요소를 가지고 있습니다.

이동 ++; while 루프에서 마지막 문장이 될 수 있습니다. a == sim-1 그것의 while 루프를 다시 입력 a++ 그래서 a == sima을 증가시키고 temp[a]에 액세스하려고 할 때 다음 충돌 할 것

1

.

a을 시작 대신 while 루프의 끝에 추가하여 문제를 해결할 수 있습니다.

0

음, temp [a]가있는 것이 확실한데, a == sym가 temp [a]에 할당 한 빈 문자열을 반환하는 경우 substr (a, 1)을 사용하는 것이 더 미묘한 문제입니다. 이것은 크래시를 일으키지 않았지만 여전히 오류입니다.

관련 문제