2013-06-30 4 views
0

여기서 일어나는 일에 대해 상당히 혼란스러워합니다.C char 포인터 동적 할당 - 알 수없는 길이의 값 할당

while ((ent = readdir(dir)) != NULL) 
    { 
     char *name = ent -> d_name; 
     .... 
    } 

이것은 디렉토리를 검색하는 데 필요한 일부 기본 코드입니다. 공정하다. 하지만 어떻게 컴파일러가 ent -> d_name의 크기를 결정할 수 있기 때문에이 컴파일 방법을 이해할 수 없습니까? 아무도 그것을 컴파일 할 때 알지 못한다. 그리고 그걸 위해 메모리를 할당해야한다. 그렇지? 컴파일러가 자동으로 malloc()을 사용하여이 작업을 수행하고 있습니까? 우분투에서 GCC를 사용하고 있습니다.

미리 감사드립니다.

답변

3
  • 컴파일러가 ent -> d_name의 크기를 결정할 수 있습니까?

컴파일러는 필요하지 않습니다. 다음

리눅스에서

dirent 구조를 정의한다 :이

char *name = ent -> d_name; 

name 단지 ent->d_name 어레이의 첫 번째 요소를 가리키는

struct dirent { 
    ino_t   d_ino;  /* inode number */ 
    off_t   d_off;  /* offset to the next dirent */ 
    unsigned short d_reclen; /* length of this record */ 
    unsigned char d_type;  /* type of file; not supported 
            by all file system types */ 
    char   d_name[256]; /* filename */ 
}; 

후.

  • 컴파일러가 자동으로 malloc()을 실행하여이 작업을 수행합니까?

여기

while ((ent = readdir(dir)) != NULL) 

readdirdirent 창 구조를 가리키는 포인터.

이 사람의 말씀입니다 :

성공

, readdir은()는 dirent 구조체를 반환한다.

은 분명히 readdir 당신을 위해 메모리를 할당 (이 구조는 정적으로 할당 될 수있다. (3) 해제하지 마십시오).

또한이 읽기 : 어쩌면 나는 명백한 누락 why does the C readdir man page say to not call free on the static allocated result struct

1

,하지만 name 인 경우 char *ent->d_name이 (가 정확한 타이핑해야하는)를 char *이며, 다음 확실히 일어나고있는 모든 것을 그 하나입니다 char (name) 블록의 포인터가 다른 포인터 (ent->d_name)가 가리키는 블록 char의 동일한 블록을 가리 키도록 설정되어 있습니다.

계속되는 메모리 할당이 없다고 생각됩니다.