C 포인터에 직접 값 할당
저는 이제 막 C를 배우기 시작했고 포인터가 어떻게 작동하는지 이해하기 위해 Windows용 MinGW를 사용하는 간단한 프로그램을 실행해왔습니다.다음을 시도했습니다.
#include <stdio.h>
int main(){
int *ptr;
*ptr = 20;
printf("%d", *ptr);
return 0;
}
컴파일은 정상적으로 이루어졌지만 실행파일을 실행하면 동작하지 않습니다.값이 명령줄에 출력되지 않고 대신 .exe 파일이 동작을 정지했다는 오류 메시지가 나타납니다.
단, int 변수에 값을 저장하고 다음과 같이 *ptr을 해당 변수의 메모리 주소에 할당하려고 하면 다음과 같이 됩니다.
#include <stdio.h>
int main(){
int *ptr;
int q = 50;
ptr = &q;
printf("%d", *ptr);
return 0;
}
정상적으로 동작합니다.
궁금한 점은 포인터에 리터럴 값을 직접 설정할 수 없는 이유는 무엇입니까?온라인 튜토리얼에서 포인터를 찾아봤는데, 대부분의 튜토리얼은 두 번째 예시와 같은 방식으로 진행됩니다.
어떤 도움이라도 감사합니다.
포인터를 초기화하지 않는 것이 문제입니다."원하는 곳"에 대한 포인터를 만들었습니다. 포인터는 다른 변수의 주소이거나 코드의 중간이거나 전혀 매핑되지 않은 메모리일 수 있습니다.
'만들다'를 해요.int
내 에 있는 .int *
가리킬 변수입니다.
두 번째 예에서는 이 작업을 수행하지만 여기서는 관련이 없는 다른 작업을 수행합니다.가장 간단한 조작은 다음과 같습니다.
int main(){
int variable;
int *ptr = &variable;
*ptr = 20;
printf("%d", *ptr);
return 0;
}
에서는, 「」, 「」.int
왜냐하면 수수초초초초초초 whatever whatever whatever whatever whatever whatever whatever whatever whatever whatever whatever whatever whatever whatever whatever로 대체하기 입니다.하지만 괜찮습니다.「 」, 「 」, 「 」20
포인터가 초기화되어 있는 것이 포인트입니다.variable
실제로 다음과 같은 경우에 포인팅할 원시 메모리를 할당할 수 있습니다.
int main(){
void *memory = malloc(sizeof(int));
int *ptr = (int *)memory;
*ptr = 20;
printf("%d", *ptr);
free(memory);
return 0;
}
코멘트가 있는 첫 번째 프로그램
#include <stdio.h>
int main(){
int *ptr; //Create a pointer that points to random memory address
*ptr = 20; //Dereference that pointer,
// and assign a value to random memory address.
//Depending on external (not inside your program) state
// this will either crash or SILENTLY CORRUPT another
// data structure in your program.
printf("%d", *ptr); //Print contents of same random memory address
// May or may not crash, depending on who owns this address
return 0;
}
두 번째 프로그램(댓글 포함)
#include <stdio.h>
int main(){
int *ptr; //Create pointer to random memory address
int q = 50; //Create local variable with contents int 50
ptr = &q; //Update address targeted by above created pointer to point
// to local variable your program properly created
printf("%d", *ptr); //Happily print the contents of said local variable (q)
return 0;
}
포인터는 사용자가 작성한 다른 변수를 포인팅하거나 malloc 콜의 결과를 포인팅함으로써 자신이 관리하고 있는 주소에 할당되어 있음을 알 때까지 사용할 수 없습니다.
그 전에 사용하는 것은 초기화되지 않은 메모리에 의존한 코드를 작성하는 것입니다.이 코드는 크래시 될 가능성이 높지만 최악의 경우 프로그램이 이미 소유하고 있는 메모리 공간에 랜덤 메모리 주소가 포함되어 있는 경우가 있습니다.프로그램의 다른 곳에서 사용하고 있는 데이터 구조를 덮어쓰게 되면 신의 가호가 있기를 바랍니다.
첫 번째 예에서는 ptr이 초기화되지 않았기 때문에 지정되지 않은 메모리 위치를 가리킵니다.이 지정되지 않은 위치에 무언가를 할당하면 프로그램이 중단됩니다.
두 번째 예에서는 ptr = &q라고 하면 주소가 설정되므로 괜찮습니다.
포인터의 값을 설정할 수 있지만 "new"를 사용하여 포인터의 메모리를 요청하면 해당 값을 설정할 수 있습니다.코드 표시는 다음과 같습니다.
int main(){
int *ptr;
ptr = new int; //ask for memory
*ptr = 20;
printf("%d", *ptr);
return 0;
}
언급URL : https://stackoverflow.com/questions/17665793/directly-assigning-values-to-c-pointers
'programing' 카테고리의 다른 글
VueJS 앱 내에서 VuePress 문서에 액세스하시겠습니까? (0) | 2022.08.13 |
---|---|
컬렉션의 hashCode 메서드에 대한 최적의 구현 (0) | 2022.08.13 |
텍스트 상자에 입력하는 동안 목록 검색 VueJs (0) | 2022.08.13 |
Vuex 및 VueJs(변환 핸들러 외부에 있는 vuex 스토어 상태를 변환하지 마십시오) (0) | 2022.08.13 |
java.util의 차이.랜덤 및 java.security.Secure Random (0) | 2022.08.13 |