함수는 C++에서 로컬 변수 오류의 주소를 반환합니다.

Shikha Chaudhary 2023년10월12일
  1. 함수는 C++에서 로컬 변수 오류의 주소를 반환합니다.
  2. 함수의 원인은 C++에서 로컬 변수의 주소를 반환합니다.
  3. 함수가 지역 변수의 주소를 반환하는 예 C++에서 발생하는 오류
  4. 결론
함수는 C++에서 로컬 변수 오류의 주소를 반환합니다.

범위에 따라 C 및 C++의 변수는 지역 변수와 전역 변수로 나뉩니다. 전역 변수는 프로그램의 모든 부분에서 액세스할 수 있지만 지역 변수의 경우에는 그렇지 않습니다.

따라서 코드에 다양한 기능이 관련되어 있을 때 이를 신중하게 사용하는 것이 중요합니다. 그렇지 않으면 반환된 로컬 변수의 주소 오류가 발생할 수 있습니다.

이 오류가 발생하는 이유와 해결 방법에 대해 논의하겠습니다.

함수는 C++에서 로컬 변수 오류의 주소를 반환합니다.

함수가 로컬 변수의 주소를 반환합니다 오류에 대한 이유와 가능한 수정 사항을 이해하려면 로컬 변수가 어떻게 작동하는지 알아야 합니다. 먼저 이것을 논의합시다.

C++에서 지역 변수의 동작

지역 변수는 함수 내부에 정의된 변수로 특정 함수 외부에서는 사용할 수 없습니다. 즉, 정의된 함수 내부에만 존재하며 프로그램의 다른 부분에서는 액세스할 수 없습니다.

그리고 여기에 매우 중요한 정보가 있습니다. 로컬 변수의 수명은 함수 실행이 종료되는 즉시 소멸됩니다.

이 예를 보십시오. 여기에서 변수 costdemo() 함수 내에서 선언됩니다. 따라서 그 범위는 이 기능으로만 제한됩니다.

main 블록 내에서 이 지역 변수에 액세스하려고 시도하므로 프로그램에서 오류가 발생합니다.

이것은 본질적으로 지역 변수가 작동하는 방식입니다.

#include <iostream>
using namespace std;

void demo() {
  int cost = 5000;
  cout << "The variable cost is local to the demo function." << endl;
}
int main() {
  int cakes = 10;
  demo();
  cout << "Payable amount: " << cost;
}

출력:

In function 'int main()':
error: 'cost' was not declared in this scope
     13 |     cout << "Payable amount: " << cost;
        |                                   ^~~~

이제 범위 밖에서 지역 변수를 사용하는 것이 어떻게 불법인지 알게 되었습니다. 함수가 로컬 변수의 주소를 반환합니다 오류가 발생하는 이유에 대해 논의해 보겠습니다.

C++의 지역 변수 및 함수에 대한 자세한 내용은 문서를 참조하세요.

함수의 원인은 C++에서 로컬 변수의 주소를 반환합니다.

함수는 로컬 변수의 주소를 반환합니다 오류는 일반적으로 함수 및 로컬 변수로 작업하는 동안 발생합니다. 정의된 범위 밖에서 로컬 변수에 액세스할 수 없는 방식으로 해당 범위 외부의 주소에도 액세스할 수 없습니다.

이렇게 보세요. 정의된 범위 밖의 지역 변수에 액세스하려고 하면 위의 예에서 볼 수 있듯이 이 범위에서 선언되지 않은 변수 오류가 발생합니다.

그러나 정의된 범위를 벗어난 지역 변수의 주소에 액세스하려고 하면 함수가 지역 변수의 주소를 반환합니다 오류가 발생합니다.

이런 일이 일어나는 이유는 다음과 같습니다.

함수 실행이 완료되면 로컬 변수가 소멸된다는 것을 알고 있습니다. 이것은 지역 변수의 주소를 반환하는 포인터가 이제 존재하지도 않는 객체를 가리키고 있음을 의미합니다.

지역 변수에 대한 포인터는 지역 변수가 있는 함수 외부로 나갈 수 없습니다. 그러나 이런 일이 발생하면 포인터가 댕글링 포인터로 변경되어 함수가 로컬 변수의 주소를 반환합니다 오류가 발생한다고 말할 수 있습니다.

이 오류는 다양한 경우에 발생할 수 있습니다. 하나씩 논의해 봅시다.

함수가 지역 변수의 주소를 반환하는 예 C++에서 발생하는 오류

function return the address of the local variable 오류로 실행되는 이러한 모든 코드의 원인은 위에서 설명한 것과 동일하지만 몇 가지 예를 자세히 살펴보겠습니다.

함수는 지역 변수에 대한 포인터를 반환합니다.

아래 주어진 코드를보십시오. demo()라는 함수가 있습니다. 이 함수는 두 개의 정수 값을 가져와 더합니다.

함수는 변수 cost에 합계를 저장한 다음 이 변수의 주소를 반환합니다. 하지만 이 코드를 실행하면 반환된 지역 변수의 주소 오류가 발생합니다.

여기서 두 가지를 주목하십시오.

  1. 변수 costdemo() 함수 내에서 정의됩니다. 따라서 그 범위는 이 기능으로만 제한됩니다. 지역 변수입니다.
  2. return 문은 로컬 변수 cost의 주소를 가진 포인터를 반환합니다.

우리는 demo() 함수가 실행을 마치자마자 그 안에 있는 지역 변수 cost도 소멸된다는 것을 알고 있습니다. 이것은 이전에 cost 변수의 주소를 가리키던 포인터가 이제 우리가 더 이상 소유하지 않는 메모리의 위치를 가리키기 시작한다는 것을 의미합니다.

따라서 이 오류가 발생합니다.

#include <iostream>
using namespace std;

int* demo(int cherry, int pie) {
  int cost = cherry + pie;
  return &cost;
}

int main() { int* ans = demo(100, 20); }

출력:

In function 'int* demo(int, int)':
warning: address of local variable 'cost' returned [-Werturn-local-addr]
    7 |    return &cost;
      |           ^~~~~
note: declared here
    6 |    int cost = cherry + pie;
      |        ^~~~

이 문제를 해결하는 방법을 살펴보겠습니다. 문제는 반환 주소가 지역 변수의 주소라는 것입니다. 따라서 동적 메모리 할당이 이를 해결하는 데 도움이 됩니다.

main 블록 내에서 cost 변수를 동적으로 정의하고 메모리를 할당합니다. 그런 다음 이 변수를 demo() 함수의 매개변수로 전달합니다.

#include <iostream>
using namespace std;

int* demo(int cherry, int pie, int* cost) {
  *cost = cherry + pie;
  return cost;
}

int main() {
  int* cost = new int;
  cost = demo(100, 20, cost);

  cout << "The total is stored at address: " << cost;
}

출력:

The total is stored at address: 0x55c7997a7eb0

이 코드를 실행하면 이번에는 올바른 출력을 얻습니다. 이는 cost 변수가 demo() 함수 외부에서 선언되기 때문에 더 이상 지역 변수가 아니기 때문입니다.

함수는 범위가 로컬인 문자열을 반환합니다.

다음 코드 스니펫을 보십시오. 여기에서 사용자의 입력으로 이름을 가져오고 checkname() 기능을 사용하여 유효한지 확인합니다.

checkname() 함수 내에서 fullname이라는 문자열을 정의하고 확인 조건을 통과하면 반환합니다. 그러나 코드는 function returns the address of the local variable 오류로 실행됩니다.

이런 일이 일어나는 이유는 다음과 같습니다.

범위가 checkname() 함수로 제한되는 fullname이라는 문자열이 있습니다. 또한 문자열은 전달되기 전에 포인터로 축소되는 배열과 같습니다.

main 블록으로 돌아가면 컨트롤이 해당 함수 밖으로 이동했기 때문에 함수의 로컬 변수가 소멸됩니다.

이것이 오류가 발생하는 이유입니다.

#include <cstring>
#include <iostream>
using namespace std;

char* checkname() {
  char fullname[20];
  //....
  //......
  //....
  if ((strlen(fullname)) >= 4 && (strlen(fullname)) < 30) {
    return fullname;
  } else {
    return NULL;
  }
}

int main(void) {
  char name[20];
  cout << "Enter name:" << endl;
  name = checkname();
}

출력:

warning: address of local variable 'fullname' returned [-Wreturn-local-addr]

이 문제를 해결하려면 데이터를 반환하는 대신 다음과 같이 함수에 전달합니다.

#include <cstring>
#include <iostream>
using namespace std;

void checkname(char *fullname) {
  if ((strlen(fullname)) >= 4 && (strlen(fullname)) < 30) {
    cout << "Success";
  } else {
    cout << "In else block";
  }
}

int main(void) {
  char name[20];
  cout << "Enter name:" << endl;
  checkname(name);
}

출력:

Enter name:
In else block

보세요, 이번에는 코드가 잘 실행되고 아무 입력도 받지 않았기 때문에 else 블록 안으로 들어갑니다.

이렇게 하면 문제가 해결되지만 보다 강력한 솔루션은 다음과 같이 fullname 변수에 메모리를 동적으로 할당하는 것입니다.

char *fullname = malloc(sizeof(char) * the_size);
.......return fullname;

메모리를 동적으로 할당할 때 전체 프로그램이 실행될 때까지 수명이 유효한 힙에서 할당됩니다. 따라서 이제 fullname 변수를 반환하면 malloc에 의해 정의된 주소를 얻고 코드가 정상적으로 실행됩니다.

또한 완료되면 메모리를 해제하는 것이 메모리 누수를 방지하는 좋은 방법입니다.

결론

이 기사에서는 C++의 함수가 로컬 변수의 주소를 반환합니다 오류에 대해 설명했습니다. 우리는 지역 변수가 어떻게 작동하는지, 범위 밖에서 접근하려는 시도가 어떻게 불법인지 배웠습니다.

일부 사용 사례를 통해 이 오류의 원인과 가능한 솔루션을 확인했습니다.

관련 문장 - C++ Error