함수 에서 동적 메모 리 를 되 돌려 줍 니 다.
#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;
}
캡 처 실행:포인터 참조 방법 에 대한 프로 세 스 도 는 다음 과 같 습 니 다.
능력 에 한계 가 있 으 니 분명하게 말 하지 못 한 부분 이 있 을 수 밖 에 없 으 니 양해 해 주 십시오.
이상 은 여러분 에 게 가 져 온 간단 한 이야기 입 니 다.함수 에서 동적 메모리 의 모든 내용 을 되 돌려 드 립 니 다.많은 응원 부 탁 드 리 겠 습 니 다~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
예를 들어 urlopen의 데이터 사용법데이터 매개 변수는 선택할 수 있습니다. 데이터를 추가하려면 바이트 인코딩 형식의 내용, 즉bytes 형식이면bytes () 함수를 통해 전환할 수 있습니다. 또한 이 데이터 매개 변수를 전달하면 GET 방식으로 요...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.