함수 에서 동적 메모 리 를 되 돌려 줍 니 다.

1.다음 과 같은 문제 가 있다.

#include <iostream>
using namespace std;

void GetMemeory(char* p)
{
  p=(char*)malloc(sizeof(char)*100);
}

int main()
{
  char *str=NULL;
  GetMemeory(str);
  strcpy(str,"Thunder");
  strcat(str,"Downloader");
  printf(str);
  system("pause");
  return 0;
}
우리 가 원 하 는 출력 은:ThunderDownloader
그러나 우리 가 이 코드 를 실행 할 때 프로그램 이 무 너 진 것 을 발견 했다.
사실 우 리 는 깊이 분석 해 보면 str 가 GetMemory()함수 에 들 어 갔 을 때 이 함수 가 임시 적 으로 만 들 어 졌 다 는 것 을 알 수 있다.
의 포인터 변수 p 를 가리 키 고 NULL 을 가리 킵 니 다.그 다음 에 우 리 는 임시 포인터 변수 p 동적 으로 메모 리 를 분배 합 니 다.우리 가 돌아 올 때 주의 하 십시오.
전체 임시 포인터 변 수 는 스 택 메모리 에서 분 배 된 것 이기 때문에 방출 됩 니 다.하지만 우리 가 이전에 들 어 온 str 의 메모리 주소 와 임시 변 수 는
메모리 주 소 는 다 릅 니 다.따라서 str 는 함수 GetMemory 에 분 배 된 메모 리 를 가 져 올 수 없 기 때문에 뒤의 문자열 복사 와 링크 작업
프로그램 이 무 너 질 겁 니 다.
우 리 는 아래 의 도형 으로 더욱 생동감 있 는 이 과정 을 할 수 있다.
:

str 자체 메모리 가 0x 123 임시 포인터 변수 p 의 메모리 가 0x 456 동적 으로 분 배 된 메모리 시작 주 소 를 0x 789 로 가정 합 니 다.
GetMemory 함수 가 끝 났 을 때 p 가 풀 렸 고 더 이상 동적 으로 분 배 된 메모 리 를 가리 키 는 지침 이 없습니다.그리고 str 도 불가능 해 요.
이 동적 으로 분 배 된 메모리 의 주 소 를 가 져 옵 니 다.그래서 메모리 유출 도 일 으 켰 습 니 다.
우 리 는 다음 과 같은 두 가지 방법 으로 이 문 제 를 해결 할 수 있다.
하 나 는 2 급 포인터 입 니 다.

#include <iostream>
using namespace std;

void GetMemeory(char** p)
{
  (*p)=(char*)malloc(sizeof(char)*100);
}

int main()
{
  char *str=NULL;
  GetMemeory(&str);
  strcpy(str,"Thunder");
  strcat(str,"Downloader");
  printf(str);
  system("pause");
  return 0;
}
캡 처 실행:

2 급 지침 에 관 한 방법 은 다음 과 같은 절차 도 를 참고 할 수 있다.

하 나 는 포인터 의 인용 방법 입 니 다.

#include <iostream>
using namespace std;

void GetMemeory(char*& p)
{
  p=(char*)malloc(sizeof(char)*100);
}

int main()
{
  char *str=NULL;
  GetMemeory(str);
  strcpy(str,"Thunder");
  strcat(str,"Downloader");
  printf(str);
  system("pause");
  return 0;
}
캡 처 실행:

포인터 참조 방법 에 대한 프로 세 스 도 는 다음 과 같 습 니 다.

능력 에 한계 가 있 으 니 분명하게 말 하지 못 한 부분 이 있 을 수 밖 에 없 으 니 양해 해 주 십시오.
이상 은 여러분 에 게 가 져 온 간단 한 이야기 입 니 다.함수 에서 동적 메모리 의 모든 내용 을 되 돌려 드 립 니 다.많은 응원 부 탁 드 리 겠 습 니 다~

좋은 웹페이지 즐겨찾기