2017-12-12 12 views
-1

문자열의 첫 번째 문자를 제거하라는 연습 문제에 대해 연구 중입니다. 전의. char * string = "Rudolph", removeFirst (string)을 호출 한 후, string은 이제 "udolph"와 동일합니다.메인에서의 문자 포인터 연산 대 다른 함수에서

내가 주인공으로 다 알아 차려도 "udolph"라는 결과가 나옵니다. 여기 내 코드는 다음과 같습니다.

int main() { 
    char *string = "Rudolph"; 
    printf("%s\n", string); 
    //removeFirst(string); 
    string++; 
    printf("%s\n", string); 
    return 0; 
} 

그러나 다른 함수를 호출하면 내 출력은 루돌프입니다. 여기에 다시는 내 코드입니다 : 내가 포인터 함께 일하고 있어요 점을 감안

void removeFirst(char *string) { 
    if (string == "" | string == NULL) 
    return; 
    string++; 
} 

int main() { 
    char *string = "Rudolph"; 
    printf("%s\n", string); 
    removeFirst(string); 
    //string++; 
    printf("%s\n", string); 
    return 0; 
} 

, 나는 removeFirst와에서 변경 한도 메인에 그것을 만들해야한다고 생각했다. 왜 그렇게 작동하지 않습니까?

+0

'removeFirst()'함수의 근본적인 오해 : 먼저 변수'string'는 그 함수에 국한되어 있으므로 함수에서 변경하면'main()'에 영향을 미치지 않습니다. 둘째, 문자열을'=='와 비교할 수 없다. 단지 포인터를 비교하는 것 뿐이다. 셋째, 이러한 것들을 고쳤더라도 main의'string'은 리터럴에 할당되고 문자열 리터럴은 읽기 전용이므로 segfault가됩니다. –

답변

1

로컬 변수가 변경됩니다. C는 값으로 전달됩니다. A char*string과 같으며 호출 된 함수 removeFirst()에 있습니다. 변경 사항을 적용한 다음 복사본에 적용된 변경 사항을 원래 변수에 반영해야합니다. 그것은 여기서 일어나지 않을 것입니다. 그래서 이전 사례와 같은 결과를 얻지 못합니다.

string == "" 두 주소를 예상했던대로 비교하지 않았습니다.

당신은 main()

printf("%s\n", string); 출력 udolph에서 그런 다음이

removeFirst(&string); 

void removeFirst(char **string) { 
    if (*string == NULL) 
    exit(1); 
    (*string)++; 
} 

같은 변경 작업을 수행 할 수 있습니다.

포인터 변수의 주소를 전달하는 경우입니다. 호출 된 함수의 로컬 변수 string에 포함 된 메모리를 액세스하면 원래 변수로 변경됩니다. 이것이 바로 main()의 변경 사항을 유지하는 것입니다.