2017-02-11 2 views
1

함수에 char 포인터를 전달하고 값을 설정하고 다시 전달하려고합니다. 여기에 내 시도가 있지만 printf가 쓰레기를 인쇄하는데 어디서 잘못 되었습니까?C char 배열 포인터

int a() { 
    char *p;  
    b(p);  
    printf("%s", p); 
    return 0; 
} 

int b(char * ptr) { 
    ptr = "test string"; 
    return 0; 
} 

답변

3

포인터에 대한 참조를 전달하십시오. 을 통과 정의되지 않은 동작을 방지하기 위해 여기에 p

int a(void) { 
    char *p = NULL;  
    p = b(p);  
    printf("%s", p); 
    return 0; 
} 

char * b(char * ptr) { 
    ptr = "test string"; 
    return ptr; 
} 

NULL으로 초기화됩니다 : 당신은 포인터의 값을 설정하고 다시 전달하려는 경우

int b(char **ptr) 
{ 
    *ptr = "Print statement"; 
    //your code 
} 
//call 
b(&p); 
+0

나는이 하찮은 일에 속 태우고 알고하지만 난'문자를 변경합니다 : 기능 b() 대신 리터럴 문자열로 초기화 된 자신의 포인터를 선언 할 수 끈. – d3L

+0

나는 const 포인터를 잘 사용하지 않아서 제안 할 수 없다. – Pbd

+0

''Print statement "는 상수 문자열이며 실행 파일의 읽기 전용 섹션 안에 위치 할 가능성이 큽니다. 수정하면 충돌이 발생합니다. 'const char *'' ''는 문자열의 수정을 막습니다. – d3L

2

b()는 포인터를 반환해야 초기화되지 않은 값을 함수에 반환합니다. p을 다른 문자열 리터럴로 초기화 할 수도 있습니다. b 안에, ptrb에 전달 된 포인터 p의 사본입니다. ptr에 저장된 값을 문자열 리터럴 "test string"의 주소에 다시 할당하면 원래 포인터 p은 변경되지 않습니다. ptr을 호출 함수로 다시 전달하고 pb의 반환 값으로 다시 할당하면 호출 함수에서 업데이트 된 값을 사용할 수 있습니다.

@M.M은 의견에서 언급 한 것처럼 다소 중복됩니다. 그것이 일정하기 때문에`** const를 문자`에`**

int a(void) { 
    char *p = b();  
    printf("%s", p); 
    return 0; 
} 

char * b(void) { 
    char *ptr = "test string"; 
    return ptr; 
} 
+0

'b'에'char * '의 리턴 타입을 주려고했습니다. 그러나이 코드에서 함수 매개 변수는 중복되므로 제거해야합니다. (사실'b (p)'는 초기화되지 않은 포인터 값을 사용하여 정의되지 않은 동작을 일으킨다). –

+1

@ M.M-- 의견에 감사드립니다. 나는 모든 것이 지금 고쳐 졌다고 생각한다. 나는 _lvalue conversion_에 관한 C11 §6.3.2.1 2가 정의하지 않은 동작에 대한 관련 섹션이라고 생각합니다. "lvalue가 자동 저장 기간의 객체를 지정하고 해당 객체가 초기화되지 않은 경우 ... 동작은 다음과 같습니다. 정의되지 않았습니다. " 이 상황에 더 적합한 다른 인용문이 있으면 함께 전달하십시오. –