2013-12-13 2 views
4

음, 나는 C를 처음 사용합니다. 제 제목에서 말하고 싶은 것은 알고 싶습니다.포인터로 선언 된 모든 변수는 메모리를 할당해야합니까?

나는 다음과 같은 포인터를 선언한다고 가정, 그리고

char *chptr1; 
char **chptr2; 
int *i; 
int **ii; 
struct somestruct *structvar1; 
struct somestruct **structvar2; 

,

  1. 내가 그들에 데이터를 저장하기 전에, 모든 변수에 대한 메모리를 할당해야합니까?
  2. 메모리를 할당 할 필요가없는 특별한 경우가 있습니까? 이것을 위해 나는 char 포인터에 대해 하나를 알고, 메모리 자체를 할당하는 strdup()에 대해 많이 신경 쓰지 않습니다.
  3. 추가 제안 사항을 환영합니다.
+3

여전히 strdup''에 대해 신경 쓸 필요를 [해야'free'd] 간단한 대답에 대한 – amdixon

답변

8

포인터 포인트를 사용 후 free()를 호출합니다. 당신이 당신을 가리키게하는 것은 당신에게 달려 있습니다.

  • 초기화되지 않은 상태로 둘 수 있으며 사용하지 않아도됩니다. int * q; 조금 어리석은 일입니다. int x; int * q = &x;

  • 당신은 그들에 동적으로 할당 된 메모리의 주소를 저장할 수 있습니다 : int * q = malloc(29);

+2

1 ,하지만 마지막 예제는 실제 세상에서 사용해야하는 것과 전혀 다른 것처럼 보입니다. 'int * q = malloc (sizeof (* q)); 또는'int * q = malloc (sizeof (int)); '와 같은 것이 더 적합 해 보일 것입니다. – user694733

3

먼저 이해해야 할 것은 포인터가 메모리 주소 또는 다른 변수의 주소를 저장하는 데 사용되는 변수입니다. 포인터를 선언하면 해당 포인터를 가리키는 데이터가 아니라 해당 포인터에 대한 메모리가 할당됩니다. 예를 들어 ,

char *ptr; //Here you allocated memory for pointer variable. 
ptr = malloc(sizeof(char)); // allocated memory for the data pointed by ptr 

는 그런 것들에 메모리

free(ptr); // DE-allocates memory pointed by ptr and not variable ptr. 
1

내가 C에서 변수라고 생각

  • 당신은 그 (것)이 존재하는 것을 가리 할 수 ​​있습니다 포인터가 메모리에 추가되었습니다. 그리고 순수 포인터는 메모리가 없습니다. 따라서 데이터를 저장하려면 포인터에 메모리를 제공해야합니다. 물론, 메모리를 할당하는 방법은 여러 가지가 있습니다.

    첫째 :

    uint32_t x; 
    uint32_t *p = &x; 
    uint32_t array[10]; 
    uint32_t *q = array;// equals to int *q = &array[0]; 
    

    둘째 :

    #define NUM_MACRO ((uint32_t) 10) 
    //we must free after we using. Or, perhaps we we will get a segment fault. 
    uint32_t *p = malloc(size(uint32_t) * NUM_MACRO); 
    
  • 2

    내가 그들에 데이터를 저장하기 전에, 모든 변수에 대한 메모리를 할당해야합니까?

    사용 사례에 따라 다릅니다.

    사용자 이름을 입력 할 수있는 프로그램이 있다고 가정하고 사용자 이름을 입력하지 않으면 하드 코드 된 값 "기본 사용자"가 표시됩니다. 이제 그 이름을 arround에 전달하려고합니다. 사용자가 이름을 입력했다면, 그것을위한 공간을 할당하고 그 포인터를 전달할 수 있습니다.사용자 이름을 지정하지 않으면 미리 정의한 하드 코딩 된 값을 가리키며 메모리를 할당 할 필요가 없습니다. 위의 경우

    char const *Default = "Default User" 
    char *username = NULL; 
    username = getUser(); // here the name is allocated dynamically if it is present. 
    if(username == NULL) 
        username = Default; 
    

    는 "기본 사용자"에 대한 sapce에이 문자열이 이미 컴파일러로 실행 파일에 예약되어 있습니다, 그래서 당신은 그것을 조작하지 않으려면 당신은 그것을 위해 추가 메모리를 할당 할 필요가 없습니다.

    낮은 수준의 장치를 프로그래밍하고 장치에서 제공하는 하드웨어 버퍼에 대한 포인터가있는 경우도 있습니다. 이 경우에는 메모리를 할당하지 않지만 고정 주소에있을 수있는 해당 버퍼의 포인터를 계속 사용합니다. 그래서 당신은 (A C64에 화면 테두리 색상을 변경 것 예)과 같이 포인터를 사용합니다 :

    char *BorderColor = 0xd020; 
    *BorderColor = 0; 
    
    관련 문제