2014-07-23 2 views
1

다음 코드는 주석 처리 된 행에서 세그먼트 오류 오류와 함께 중단됩니다. 라인은 한 문자를 간단하게 대체하기위한 것입니다.문자 배열 안의 문자를 교체하십시오.

#include <stdio.h> 
#include <ctype.h> 

int num(char zf[], int n) { 
    int i; 

    for (i = 0; i < n; i++) { 
     // assignment = seg fault 
     if (zf[i] == ',') zf[i] = '.'; 

     if (!isdigit(zf[i]) && zf[i] != '+' && zf[i] != '-' && zf[i] != '.') { 
      return 0; 
     } 
    } 

    return 1; 
} 

int main(void) { 
    if (num("-3+3,0", 6)) { 
     printf("valid\n"); 
    } else { 
     printf("not valid\n"); 
    } 

    return 0; 
} 

나는 왜 오류가 있으며 해결책은 무엇인지 설명하고 싶습니다. strncpy? 함수 num의 매개 변수와 데이터 유형은 변경되지 않습니다.

+7

문자열 리터럴을 수정하면 정의되지 않은 동작입니다. 비슷한 문제가있는 질문이 있습니다. (더 많은 것이 있습니다.) http://stackoverflow.com/questions/943312/segmentation-fault-char-pointer?rq=1 – chris

+2

[문자열 리터럴을 수정하기위한 정의되지 않은 동작] (http://stackoverflow.com/questions/19372952/modifying-a-char-const-string) –

+0

그래, 문자열 리터럴은 상수입니다. –

답변

6

문자열 리터럴은 프로그램에 컴파일되어 바이트 배열로 바이너리 어딘가에 저장됩니다. Linux에서 strings 명령을 사용하여 바이너리에서 문자열 리터럴을 찾을 수 있습니다.

문자열 상수는 프로그램의 읽기 전용 부분에 존재할 가능성이 가장 높기 때문에이를 수정하기 위해 정의되지 않은 동작이 발생한 것입니다. 액세스 또는 수정해서는 안되는 메모리 부분에 액세스하거나 수정하려고하면 세그먼트 화 오류가 발생합니다.

+0

@ The ParamagneticCroissant : 텍스트를 약간 변경했습니다. –

1

비록 C 문자열 리터럴은 비정상 문자 배열 유형을 가지고 있지만 C 표준은이를 변경할 수 없습니다. 이 프로그램은 다음 문자 스트링을 수정하려고하면

상수 정수 캐릭터 것처럼

4 동일한 고려 리터럴 문자열의 시퀀스의 각 요소에 적용 그 동작이 정의되지 않았습니다..

당신은 다음과 같은 방법

int main(void) { 
    char s[] = "-3+3,0"; 

    if (num(s, sizeof(s) - 1)) { 
     printf("valid\n"); 
    } else { 
     printf("not valid\n"); 
    } 
    return 0; 
} 
0
if (num("-3+3,0", 6))에서 여기

, "-3 + 3.0은" 읽기 전용 메모리에 저장되어 주요 정의한다. 이렇게 수정하면 세그먼테이션 오류가 발생합니다.

"-3+3,0"이 스택에 저장되도록 배열을 사용하십시오. 그런 다음 값을 수정할 수 있습니다.

관련 문제