code

포인터를 리터럴(또는 상수) 문자 배열( 문자열)로 되돌리기?

starcafe 2023. 10. 15. 17:31
반응형

포인터를 리터럴(또는 상수) 문자 배열( 문자열)로 되돌리기?

이것이 틀렸다는 것을 압니다.

char* getSomething() {  
    char szLocal[5];  
    /* put something in the char array somehow */  
    return szLocal;  
}  

szLocal은 함수가 돌아온 후 언제쯤 파괴될 수 있기 때문입니다.

근데 이거 괜찮아요?

char* getSomethingElse() {  
    return "something else";  
}  

그건 사실 괜찮아요.문자열 리터럴은 일반적으로 프로그램이 실행되는 동안 사용할 수 있는 불변 메모리 영역에 할당됩니다.

c/c++문자열 리터럴을 할당하는 시기에 대한 답도 참조하십시오.

할당 측면에서는 괜찮습니다. 문자열 리터럴은 암시적으로static. 비품을 반품하는 것은 문제가 않습니다.const리터럴을 가리킵니다.

수정 가능한 것을 반환하려는 경우(비-const) 문자열, 다음과 같이 선언합니다.static char[]. 아니면 사본을 반환하는 것이 좋습니다.

return strdup("something else");

잊지말구요free그 후에strdupISO가 아니지만 거의 모든 곳에서 사용할 수 있습니다(MSVC는 제외).

문자열 리터럴의 유형은 const char * (아래 의견 참조)static char[], 그러나 불변의문자열 리터럴은 정적으로 할당된 메모리에 대한 포인터를 나타냅니다.따라서:

  1. 그런 포인터를 돌려주는 것은 아주 좋습니다.

  2. 함수 반환 유형 꼭 해야 할 와 호환되어야 합니다.const char*, 즉, 반환 형식char * 적어도 경고는 해줄 겁니다 나중에 폐를 끼칠 수도 있습니다.

  3. 함수를 사용하면 리터럴 또는malloced string 메모리 관리에 매우 신중해야 합니다.free문자열 리터럴을 입력하면 segfault가 발생할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4836534/returning-a-pointer-to-a-literal-or-constant-character-array-string

반응형