함수에 char 포인터를 전달하고 값을 설정하고 다시 전달하려고합니다. 여기에 내 시도가 있지만 printf가 쓰레기를 인쇄하는데 어디서 잘못 되었습니까?C char 배열 포인터
int a() {
char *p;
b(p);
printf("%s", p);
return 0;
}
int b(char * ptr) {
ptr = "test string";
return 0;
}
함수에 char 포인터를 전달하고 값을 설정하고 다시 전달하려고합니다. 여기에 내 시도가 있지만 printf가 쓰레기를 인쇄하는데 어디서 잘못 되었습니까?C char 배열 포인터
int a() {
char *p;
b(p);
printf("%s", p);
return 0;
}
int b(char * ptr) {
ptr = "test string";
return 0;
}
포인터에 대한 참조를 전달하십시오. 을 통과 정의되지 않은 동작을 방지하기 위해 여기에 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);
후 b()
는 포인터를 반환해야 초기화되지 않은 값을 함수에 반환합니다. p
을 다른 문자열 리터럴로 초기화 할 수도 있습니다. b
안에, ptr
은 b
에 전달 된 포인터 p
의 사본입니다. ptr
에 저장된 값을 문자열 리터럴 "test string"
의 주소에 다시 할당하면 원래 포인터 p
은 변경되지 않습니다. ptr
을 호출 함수로 다시 전달하고 p
을 b
의 반환 값으로 다시 할당하면 호출 함수에서 업데이트 된 값을 사용할 수 있습니다.
@M.M은 의견에서 언급 한 것처럼 다소 중복됩니다. 그것이 일정하기 때문에`** const를 문자`에`**
int a(void) {
char *p = b();
printf("%s", p);
return 0;
}
char * b(void) {
char *ptr = "test string";
return ptr;
}
'b'에'char * '의 리턴 타입을 주려고했습니다. 그러나이 코드에서 함수 매개 변수는 중복되므로 제거해야합니다. (사실'b (p)'는 초기화되지 않은 포인터 값을 사용하여 정의되지 않은 동작을 일으킨다). –
@ M.M-- 의견에 감사드립니다. 나는 모든 것이 지금 고쳐 졌다고 생각한다. 나는 _lvalue conversion_에 관한 C11 §6.3.2.1 2가 정의하지 않은 동작에 대한 관련 섹션이라고 생각합니다. "lvalue가 자동 저장 기간의 객체를 지정하고 해당 객체가 초기화되지 않은 경우 ... 동작은 다음과 같습니다. 정의되지 않았습니다. " 이 상황에 더 적합한 다른 인용문이 있으면 함께 전달하십시오. –
나는이 하찮은 일에 속 태우고 알고하지만 난'문자를 변경합니다 : 기능
b()
대신 리터럴 문자열로 초기화 된 자신의 포인터를 선언 할 수 끈. – d3L나는 const 포인터를 잘 사용하지 않아서 제안 할 수 없다. – Pbd
''Print statement "는 상수 문자열이며 실행 파일의 읽기 전용 섹션 안에 위치 할 가능성이 큽니다. 수정하면 충돌이 발생합니다. 'const char *'' ''는 문자열의 수정을 막습니다. – d3L