2013-02-01 2 views
2
DIR * d; 
int dsize=0; 
struct dirent * de; 
char *dir[1024]; 
d=opendir("."); 
while ((de = readdir(d))) 
      {                    
       if((de->d_type) & DT_DIR) 
       { 
        dir[dsize]= de->d_name; 
        dsize++; 
       } 
      } 

char 포인터의 배열에 파일 이름의 주소를 저장하려고합니다.배열의 포인터 오류

포인터에 약간 녹슬었고 포인터 리뷰의 일부 페이지를 읽었지만 내가 뭘 잘못하고 있는지 확실하지 않습니다. "경고 : 할당은 포인터가 캐스트없이 포인터에서 발생합니다."라고 말합니다. struct 때문에 구조체가 막 혔을 까?

+1

무엇이'dirent','DT_DIR' 및'd_name'입니까? –

+3

OT : ['readdir()'] (http://linux.die.net/man/3/readdir)는 각각을 덮어 쓸 수 있습니다. 파일에서 파일로 이동할 때 DIR 구조의 파일 이름. 당신은 그 기억을 "소유하지"않습니다. 이름을 유지하려면 이름을 복사해야합니다 (예 :'malloc()'또는 고정 버퍼 솔루션). "man 3 readdir"에서 : * "동일한 디렉토리 스트림에 대한 readdir() 호출 이후에 readdir()에 의해 반환 된 데이터를 덮어 쓸 수 있습니다." " – WhozCraig

+0

@ ivaylo ia의 부분은 을 포함합니다. DT_DIR은 디렉토리 dname은 문자 배열의 이름이고 dirent는 libary의 구조체입니다 –

답변

5

그런 식으로 포인터를 저장할 수 없습니다. 그들은 매번 덮어 씁니다. readdir으로 전화를 걸면 잘못된 메모리에 매달린 포인터가 있습니다. 당신이 디렉토리 항목을 저장하려면, 당신은

char dir[1024][256]; 
while (de = readdir(d)) { 
    if (de->d_type & DT_DIR) { 
     if (dsize < 1024) { 
      strcpy(dir[dsize], de->d_name); 
      dsize++; 
     } 
    } 
} 

dir 배열 범위에 대한 체크를 잊지 마세요 단지 포인터, 전체 이름을 복사해야합니다. 그렇지 않으면 스택을 덮어 쓸 위험이 있으며 이로 인해 충돌이 발생할 수 있습니다.

+0

+1 간단한 해결책. 두 경계는 문자열 길이와'dir' 배열 길이를 검사해야하지만 그 말은 접착제 팩토리의 중간에 이미 = P입니다. 좋은 대답. – WhozCraig

+0

WhozCraig 링크를 읽은 후 이해가됩니다. 나는 그것을 보았습니다. 좋은 간단한 대답 –