C 포인터에 대한 질문 (메모리 가져오기)

2457 단어
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는 그 값이 불안정하고 확실하지 않기 때문에 이렇게 하는 것은 정확하지 않다.

좋은 웹페이지 즐겨찾기