2014-02-19 2 views
-1

내가 C.동적으로의 malloc과 realloc을

나는 문제가 문자 배열 내에서 지정된 디렉토리 내부의 파일 이름을 저장하는 데에 dirent라는 헤더 파일을 사용하여 디렉토리를 읽기 위해 노력하고 있습니다로 포인터를 숯불에 문자열을 추가.

코드는 다음과 같습니다.

char * FileNames; 

while ((DirentPointer = readdir(DirectoryPointer)) != NULL) { 

    strcpy(&FileNames[Counter], DirentPointer -> d_name); 

    Counter++; 
} 

응용 프로그램을 실행할 때 세그먼트 오류가 발생합니다. 나는 strcpy가 메모리 할당 때문에 응용 프로그램을 잘못 생각한다고 생각한다.

누구나 malloc 및 realloc을 사용하여 FileNames Char *에 메모리 할당을 동적으로 추가하는 방법을 알 수 있습니까?

+1

첫 번째 문제는 'FileNames'는 char 배열입니다. 'char ** FileNames; '라는 이름을 저장하기위한 char 포인터에 대한 포인터와 포인터가 필요합니다. –

+0

솔직히 말하면 언어에 익숙하지 않습니다. 포인터에 대한 포인터를 만들면 어떻게 strcpy 메서드에서 배열을 참조 할 수 있습니까? &&를 사용해야하나요? – Andrew

+0

이 자습서를 살펴보면 유용 할 수 있습니다. http://www.cplusplus.com/doc/tutorial/pointers/ –

답변

1

코드에서 정의되지 않은 동작이 발생하거나 대부분 충돌이 발생합니다. FileNames은 문자열을 복사하는 메모리 버퍼가 아니라 문자를 가리키는 포인터이기 때문에 strcpy 함수는 복사 할 버퍼를 경계 검사하지 않습니다. 따라서 strcpy은 할당되지 않은 메모리에 쓰기를 시도합니다. 파일 이름을 먼저 복사하려면 메모리를 할당해야합니다.

#define MAX_FILE_NUM 1000 

char *FileNames[MAX_FILE_NUM] = {0}; // initialize to NULL 
int Counter = 0; 

while((DirentPointer = readdir(DirectoryPointer)) != NULL) { 
    FileNames[counter] = malloc(strlen(DirentPointer->d_name) + 1); // + 1 for the null byte 
    // check for NULL 
    if(FileNames[i] != NULL) { 
     strcpy(FileNames[i], DirentPointer->d_name); 
     Counter++; 
    } 
    else { 
     // handle the NULL case 
     // maybe try malloc again 
    } 
} 

// after you are done with the FileNames 

for(int i = 0; i < Counter; i++) { 
    free(FileNames[i]); 
    FileNames[i] = NULL; 
} 
+0

응답 해 주셔서 감사합니다. 나는 아직도 포인터를 사용하는 방법을 알아 내려고 노력하고있다. 귀하의 코드를 시도했지만 strcpy 메서드에서 호환되지 않는 포인터 형식 오류가 발생했습니다. – Andrew

+0

'DirentPointer-> d_name'이'char *'라고 가정합니다. 그게 어떤 타입인지 알려주시겠습니까? – ajay

+0

@Andrew 죄송합니다. 코드에 실수가있었습니다. 나는 그것을 업데이트했다. 다시 시도해보고 작동하는지 알려주세요. – ajay