C 포인터에 대한 질문 (메모리 가져오기)
void GetMemory(char* p,int num){
p = (char*)malloc(sizeof(char)*num);
if(p == NULL){
exit(0);
}
}
int main(){
char* str = NULL;
GetMemory(str,10);
strcpy(str, "OK?");
cout<<str<<endl;
return 0;
}
위의 이 프로그램은GetMemory () 함수에서str에 대한 메모리 분배를 실현할 수 있다고 생각합니까?
답은:안 돼요.
이것은 오류가 있습니다. 실행하면 세그먼트 오류가 발생합니다.
그럼 어떻게 고칠까요?
한 가지 방법으로 만든 주소를 되돌려줍니다.
char* GetMemory1(int num){
char* p = (char*)malloc(sizeof(char)*num);
if(p == NULL){
exit(0);
}
return p;
}
이렇게 하면 정확하다.그럼 아까 거는 왜 틀렸을까요?
원래는 바늘을 전달하는 문제였고char*p의p는str의 값을 수신했다.str는 원래는NULL을 가리켰다.즉str==NULL을 가리켰다. 패스한 후에 p의 값도NULL이다.
즉 p=NULL이다. p는 지침이기 때문에 p=NULL은 p가 NULL을 가리키는 것을 의미한다.
모든 포인터가 메모리에 그 값을 저장할 수 있는 공간이 있다는 것을 알고 있습니다.char*p의 의미는 GetMemory () 에 p 포인터를 만들고 포인터가str가 가리키는 구역을 가리킨다는 것을 의미합니다.
우리가char*를 하나의 유형으로 간주하면 값에 따라 전달되는 것이기 때문에 GetMemory () 에서 공간을 개척하고 그 공간의 첫 번째 주소를 가리킨다.
그러면 결과는 p의 공간에 저장된 값이 바뀌고 개척된 공간의 첫 번째 주소가 되었다는 것을 의미한다. 즉, NULL을 가리키지 않았지만 이때str는 NULL을 가리키고
즉str를 개척된 공간의 첫 번째 주소로 가리키는 역할을 하지 못했다는 것이다.
그러면 우리는 어떻게 원 함수에서 그것을 정확하게 고칩니까? 첫 번째 주소를 되돌려주지 않고void를 사용합니까?
void GetMemory(char** p,int num){
*p = (char*)malloc(sizeof(char)*num);
if(*p == NULL){
exit(0);
}
}
이렇게 하면 됩니다.char**p는 p가 바늘을 가리키는 바늘을 의미합니다.str가 메모리에 있는 공간 주소의 값을 p에게 전달하면 됩니다.
이때 우리는 분배된 메모리 공간의 첫 번째 주소를 *p를 통해 메모리에str의 값을 저장하는 공간에 저장합니다.
p는str주소를 가리키는 바늘이기 때문에*p는str가 메모리에 있는 주소를 대표하기 때문에 이 방법은 실행할 수 있습니다
또 하나의 간단한 방법은 인용이다.
void GetMemory(char* &p,int num){
p = (char*)malloc(sizeof(char)*num);
if(p == NULL){
exit(0);
}
}
인용의 효과는 함수에서 원래의 원소의 값을 바꿀 수 있기 때문에 인용은 해결할 수 있다.또 하나의 간단한 문제가 첨부되어 있다.
int& func(){
int a = 3;
return a;
}
int main(){
int a = func();
cout<<a<<endl;
return 0;
}
만약 실행하지 않는다면 이 코드의 출력 결과는 무엇이라고 생각합니까?
이렇게 하는 것이 정확합니까?
출력은 3입니다.
우리는func() 안에서 a=3, func()를 가리키고 국부 변수를 버렸다는 것을 알았지만, 인용을 되돌려주었다. 그래서 우리 주함수의 a는 우리가 방금 버린 메모리 공간의 한 구역을 가리키고
그 구역의 값은 우리가 방금 부여한 값이 3이어서 우리가 출력한 것은 3.
그러나 이것은 정확하지 않다. 왜냐하면 그 구역의 값은 우리가 다른 방식으로 변경할 수 있거나 시스템이 다시 그것을 분배하면 주함수의 a의 값은 따라서 바뀔 수 있기 때문이다.
만약 이후에 우리가 a의 메모리 공간 주소를 변경하지 않는다면, 이후의 a는 그 값이 불안정하고 확실하지 않기 때문에 이렇게 하는 것은 정확하지 않다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.