C中的数组问题

时间:2011-08-30 11:04:07

标签: c arrays

我很困惑。在while循环中,我将每个文件名添加到一个数组中,然后将其打印出来。

然而,在for循环中,它打印出一些奇怪的东西并停止在中间执行。

请帮我解决。

char *commands[1000];

char *str;
DIR * dir;

struct dirent * entry;

char *env = getenv("PATH");

do {
    str = strsep(&env, ":");

    if(str != NULL)
        if(strlen(newEnv) > 0) {

            dir = opendir(str);
            if( dir == NULL ) break;

            flag = 0;
            while((entry = readdir(dir)) != NULL) {
                commands[++count] = entry->d_name;
                printf("---%i %s\n", count ,commands[count]);  // prints fine
            }
            closedir(dir); // close directory

        }

} while(newEnv);

commands[++count] = '\0';
printf("count = : %i\n", count);

for(int i = 0; i <  count; i ++)
{
    if(commands[i] == NULL)
        break;
    printf("aaa%i %s\n\n", i, commands[i]);  //problem loop
}

4 个答案:

答案 0 :(得分:2)

您正在设置指向dir收到的readdir结构的指针。但是,该结构是deallocated by closedir

您需要复制字符串(strdup和朋友)。

答案 1 :(得分:2)

commands[++count] = entry->d_name不会将entry->d_name字符串复制到commands[++count],而只是指定指针。在下一次迭代中,entry->d_name被覆盖,因为readdir使用静态内存来返回结果。

使用strcpy代替并自行分配内存。

答案 2 :(得分:0)

问题:

  • 添加指向数组的指针,指向
  • 后不久将由readdir/closedir解除分配的字符串
  • 如果count的起始值为0,则永远不会将commands[0]分配给并包含垃圾
  • commands[++count] = '\0';行似乎是一个错误,但幸运的是它向count添加了1,因此print count行打印正确的数字,for循环遍历右侧范围

答案 3 :(得分:0)

除了@Eugene Homyakov的回答:

您不应该依赖于使用NULL值初始化“commands”数组的最后一个循环。