2013-02-01 38 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指针数组中。与阵列的指针错误

有点生锈的指针我回去读了一些指针评论的页面,但我是 不知道我在做什么错误..不断告诉我“警告:赋值从指针没有投射整数”。我的语法是否因为结构而关闭?

+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它的一部分包括 DT_DIR告诉它的目录或者不是,d_name是dir(char数组)的名称,dirent只是库中的一个结构 –

回答

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链接后,我觉得我明白了这一点。很简单的答案 –