programing

함수에서 반환되는 문자열 리터럴의 수명

css3 2023. 9. 17. 13:28

함수에서 반환되는 문자열 리터럴의 수명

다음 코드를 고려합니다.

const char* someFun() {
    // ... some stuff
    return "Some text!!"
}

int main()
{
   { // Block: A
      const char* retStr = someFun();
      // use retStr
   }
}

함수에서someFun(),는 어디에"Some text!!"저장(ROM의 어떤 정적 영역에 있을 수 있다고 생각합니다) 및 범위 수명은 얼마입니까?

기억이 가리킬까요?retStr프로그램 전체에 걸쳐 점유되거나 블록 A가 빠져나가면 해제됩니까?

C++ Standard에서는 문자열 리터럴을 어디에 저장해야 하는지에 대해 언급하지 않습니다.그러나 프로그램의 수명이 프로그램의 수명임을 보장합니다.따라서 귀하의 코드는 유효합니다.

"Some text!!"범위가 없습니다.범위명명된 엔티티의 속성입니다.더 정확하게 말하자면, 그것은 이름 자체의 속성입니다."Some text!!"이름 없는 개체 - 문자열 리터럴입니다.이름이 없기 때문에 "범위"에 대한 논의는 전혀 의미가 없습니다.범위가 없습니다.

당신이 묻고 있는 것은 범위가 아닙니다.수명 또는 저장 기간입니다."Some text!!". C/C++의 문자열 리터럴은 정적 저장 기간을 갖는데, 이는 프로그램이 실행되는 동안 "영원히" 산다는 것을 의미합니다.그래서, 그가 차지한 기억은"Some text!!"절대 공개되지 않습니다.

문자열 리터럴은 수정할 수 없는 개체임을 (부록으로) 명심하십시오.그 기억에 쓰는 것은 불법입니다.

문자열은 프로그램 바이너리의 특수(일반적으로 최신 OS에서 읽기 전용) 섹션에 정적으로 저장됩니다.해당 메모리는 할당되지 않으며(메모리에 로드하는 동안 문자열에 대해 개별적으로, 전체 섹션에 대해서만) 할당 해제되지 않습니다.

retStr이 가리키는 메모리는 프로그램 전체에 걸쳐 점유될 것인가요, 아니면 블록 A가 빠져나가면 해제될 것인가요?

편집:

공개되지는 않겠지만.retStr사용할 수 없습니다. (블록 범위)

const char *ptr;
{   
   const char* retStr = "Scope";
   ptr = retStr;
}   

printf("%s\n", ptr); //prints "Scope"

//printf("%s\n", retStr); //will throw error "retStr undeclared"

언급URL : https://stackoverflow.com/questions/2579874/lifetime-of-a-string-literal-returned-by-a-function