2013-07-15 2 views
8

방금 ​​C를 배우기 시작했고 Windows 용 MinGW를 사용하여 포인터가 작동하는 방식을 이해하는 몇 가지 간단한 프로그램을 실행 해 왔습니다. 나는 시도 다음C 포인터에 값을 직접 할당

제대로 컴파일
#include <stdio.h> 

int main(){ 
    int *ptr; 
    *ptr = 20; 
    printf("%d", *ptr); 
    return 0; 
} 

하지만 실행 파일을 실행할 때 작동하지 않습니다 - 값이 명령 행에 인쇄, 대신 내가 .exe 파일이 없다는 오류 메시지가 표시되지 않는다 작동을 멈췄습니다. 잘 작동

#include <stdio.h> 

int main(){ 
    int *ptr; 
    int q = 50; 
    ptr = &q; 
    printf("%d", *ptr); 
    return 0; 
} 

아래에 도시 된 바와 같이 I 그 변수의 메모리 어드레스에 INT 변수에 할당 * PTR에 값을 저장하려하지만

.

제 질문은 포인터에 리터럴 값을 직접 설정할 수없는 이유는 무엇입니까? 나는 포인터에 대한 온라인 튜토리얼을 살펴 봤고 대부분은 두 번째 예제와 같은 방식으로 수행한다.

도움을 주시면 감사하겠습니다.

+0

포인터가 초기화되지 않았으므로 프로그램을 중단시킬 수 있습니다. – Till

+1

운이 좋으면 오류로 종료되었습니다. – JonnyRo

+1

@JonnyRo가 맞습니다. 실제 코드에서 이런 종류의 버그는 일주일에 걸친 디버깅 세션으로 이어져 경향이 있습니다. 디버깅 세션 중에는 다른 변수가 무작위로 변경되는 이유를 알아 내려고합니다. 공개 시연) 또는 다른 사람이 다른 값을 조작하여 "is_admin"플래그를 true로 설정하는 보안 사용. – abarnert

답변

20

문제는 포인터를 초기화하지 않는 것입니다. "원하는 곳 어디에서든지"포인터를 만들었습니다.이 포인터는 다른 변수의 주소이거나 코드의 중간이거나 전혀 매핑되지 않은 메모리 일 수 있습니다.

int * 변수가 가리 키도록 메모리에 어딘가에서 int 변수를 만들어야합니다.

두 번째 예는이 작업을 수행하지만 여기서는 관련이없는 다른 작업을 수행합니다. 여기

int main(){ 
    int variable; 
    int *ptr = &variable; 
    *ptr = 20; 
    printf("%d", *ptr); 
    return 0; 
} 

int 변수는 초기화-것이 아니라 그냥 20에 있었다 어떤 값을 대체하기 위하여려고하고 있기 때문에 즉, 괜찮습니다 : 여기 당신이해야 할 가장 간단한 일입니다. 핵심은 포인터variable을 가리 키도록 초기화된다는 것입니다. 이 지정되지 않은 메모리 위치를 가리 키도록, 첫 번째 예에서

int main(){ 
    void *memory = malloc(sizeof(int)); 
    int *ptr = (int *)memory; 
    *ptr = 20; 
    printf("%d", *ptr); 
    free(memory); 
    return 0; 
} 
1

, PTR가 초기화되지 않은 : 사실, 당신은, 당신이 원하는 경우에 가리 키도록 일부 원시 메모리를 할당 할 수 있습니다. 이 지정되지 않은 위치에 무언가를 지정하면 프로그램이 터집니다.

두 번째 예에서 ptr = & q라고 말하면 주소가 설정되므로 정상입니다.

7

먼저 프로그램 설명

중 하나
#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; 
} 

열쇠는 당신이 당신 자신이 관리 한 주소에 할당 된 알 때까지 포인터를 사용할 수있다,와 의견

#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;    
} 

두 번째 프로그램으로 당신이 만든 또 다른 변수 나 malloc 호출의 결과를 가리키면됩니다.

이전에 사용하는 방법은 임의로 메모리 주소가 프로그램에서 이미 소유하고있는 메모리 공간 내부에 있기 때문에 기껏해야 작동하지 않지만 최악의 경우 작동하지 않는 초기화되지 않은 메모리에 의존하는 코드를 만드는 것입니다. 프로그램의 다른 곳에서 사용중인 데이터 구조를 덮어 쓰면 신이 도와줍니다.

+1

좋은 그림. – abarnert

관련 문제