2017-12-26 33 views
1

포인터를 배우기 시작한 순간 코드가 작동하지 않는 이유를 알아 내려고합니다. 아직 컴파일 오류가 발생하지 않지만 코드는 내가 원하는 것을 수행하지 않습니다. 배열의 주소를 왜 지나치지 않습니까? 나는 그렇게하려고하면 나는 compiilation 오류 :(문자 배열을 수정하지 않는 함수

#include <stdio.h> 

void switch_name(char* name) 

{ 
    name= "testv2"; 
} 

void main() 
{ 
char *name1 = "test_name"; 
printf("%s\n", name1); 
switch_name(name1); 
printf("%s\n", name1); 
} 
+0

판독 추천 같은 C 표준에 따라 파라미터없이 기능 main 선언되어야한다고 고려 : 값에 의해 전달 대 기준에 의해 전달 차이는 무엇인가? (HTTPS//stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by-value) –

+0

"내 코드가 작동하지 않는 이유 -> 코드가 작동합니다." 코드는 내가 원하는 것을하지 않습니다. "-> 코드에서 무엇을 원했습니까? – chux

답변

1

잘 때문에 C 값에 의해 패스가 얻을. 당신은 (기능 swicth_name()에서 name) 지역 변수를 변경. 변경이의 주소를 전달할 유지하려면 char* 및합니다 (char**를 역 참조하여) 직접 char* 리터럴 문자열의 주소를 할당 할 수 있습니다. 예를 들어이 기능 swicth_namechar*의 주소를 가지고 여기

#include <stdio.h> 

void switch_name(char** name) 
{ 
    *name= "testv2"; 
} 

int main(void) 
{ 
    char *name1 = "test_name"; 
    printf("%s\n", name1); 
    switch_name(&name1); 
    printf("%s\n", name1); 
    return 0; 
} 

를 작동합니다. 이제 *switch_name에 단항 기호로 역 참조 할 때 변수 name에 문자열 리터럴의 주소를 할당합니다. 그 변화는 유지됩니다.

0

함수 매개 변수는 로컬 변수입니다. 원래 변수 name1 함수에서 변경되지 않았습니다 볼 수 있듯이

당신은 함수 호출과 그 정의를 다음과 같은 방법

char *name1 = "test_name"; 
switch_name(name1); 

//... 

void switch_name(/* char* name */) 
{ 
    char *name = name1; 
    name= "testv2"; 
} 

을 상상할 수있다. 함수에서 변경된 변수 인 변수 name입니다.

함수에서 변수를 변경하려면 참조로 원래 변수를 전달해야합니다. 예를

#include <stdio.h> 

void switch_name(char ** name) 
{ 
    *name= "testv2"; 
} 

int main(void) 
{ 
    char *name1 = "test_name"; 

    printf("%s\n", name1); 

    switch_name(&name1); 

    printf("%s\n", name1); 
} 

를 들어

는 다음 프로그램 첫 번째 프로그램에서

#include <stdio.h> 
#include <string.h> 

void switch_name(char* name) 
{ 
    strcpy(name, "testv2"); 
} 

int main(void) 
{ 
    char s[] = "test_name"; 
    char *name1 = s; 

    printf("%s\n", name1); 

    switch_name(name1); 

    printf("%s\n", name1); 

    return 0; 
} 

당신이 기능을 사용하여 원래 포인터 자체를 재 할당 할 예정으로 위의 프로그램을 비교.

두 번째 프로그램에서는 표준 C 함수 strcpy을 사용하여 포인터가 가리키는 데이터를 다시 할당합니다.

int main(void)