2014-11-13 2 views
1

학교에서 다른 곳에서 문자열을 뒤집어야하는 문제를 해결하려고합니다. 나는 Visual Studio에서 단계별 때 루프 내부 선에 도달 할 때문자열 요소를 복사하려고 할 때 세그먼테이션 오류가 발생합니다. (C)

void strRev(char*s) 
{ 
    int i = 0; 
    int length = strlen(s); 
    char*rev = (char*)malloc((length+1)*sizeof(char)); 

    strcpy(rev,s); 

    for(i;i<length;i++) 
     s[i] = rev[length - 1 - i]; 

    printf("%s %s",rev,s); 
} 

int main() 
{ 
    char * test = "hello"; 
    strRev(test); 
} 

, 그것은 응답 : 여기 ... 잠시이 고민과 아이디어에서 생각 된 것은 내 코드입니다. 유닉스는 나에게 세그먼트 결함을 준다. 이게 내가 누락 된 단순한 것이어야한다는 것을 알지만, 나는 아이디어가 없으며 온라인 답변이 도움이되지 않는다. 그리고 나는 시간이 없어 .. 누군가 나에게 계몽 해줘, 내가 뭘 잘못하고있어?

+1

만약 당신이 * malloc()을 사용한다면 함수에서 돌아 오기 전에 리턴 된 포인터를 free()해야한다는 것을 명심해야한다. –

+0

고맙습니다 .. 위와 같이 테스트 선언을 변경했는데 현재 작동합니다. 강사가 구체적으로 문자열을 선언 할 수 있다고 가르쳐 왔으며, 첫 번째 문자가 대 문자에 대한 포인터를 만듭니다. 수정 될 수있는 배열 .. 나는 내일 수업 시간에 그것을 가지고 올 것이다. –

답변

1

글쎄, 당신의 코드는 제자리에서하지 않습니다. (그렇지 않으면 malloc을 사용하지 않을 것입니다. 왜 sizeof (char)를 사용합니까?). 의견 제안으로()는 주요 수정 후

void strRev(char*s) 
{ 
    int i, len; 
    char tmp; 
    len = strlen(s); 
    for(i = 0; i < (len >> 1); ++i) 
    { 
     tmp = s[len - 1 - i]; 
     s[len - 1 - i] = s[i]; 
     s[i] = tmp; 
    } 
} 

을 그리고 :

이보십시오.

+0

@Seth Bergman :이 대답은 당신이 교사에게 설명해야 할 가장 똑똑한 것을 포함하고있다. – St0fF

+0

고맙습니다. 좋은 답변입니다. malloc은 malloc만을 사용합니다. 현재 수업이 과제와 일치하기 때문에, 생각했던대로 생각할 수 있습니다. (과제는 다른 강사로부터 전달되며 잘 작성되지 않았습니다. .) –

+0

또한 sizeof (char)를 사용하지 않는 이유는 무엇입니까? 이론적으로 어딘가에 어떤 시스템에서는 크기가 다를 수 있습니까? 아니면 항상 같은가요? –

1

test 수정해서는 안되는 정적으로 할당 된 버퍼를 가리 킵니다. 그리고 s[i]=rev[...]을 지정하여 수정하십시오. 이로 인해 segfault가 발생합니다.

rev[i]=s[...]을 작성하고 싶다고 생각합니다.

자리에서 수행해야하는 경우 "hello"에 동적으로 메모리를 할당하거나 스택에 할당하십시오.

관련 문제