programing

C 포인터에 직접 값 할당

minecode 2022. 8. 13. 23:16
반응형

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

반응형