c - 结构数组的值突然改变(?)

标签 c arrays struct

所以我已经查看这段代码几个小时了,尽管我努力用 printf 到处调试它,但我似乎无法理解发生了什么。以下函数是我的主要问题所在:

void drawFolders() {

printf("Going to call getSubFolder\n");
getSubFolders(".");

printf("DEBUG 1 - Return from getFolderName is: %s\n", getFolderName(3));

printf("DEBUG 2 - Return from getFolderName is: %s\n", getFolderName(5));

int k;

for(k = 0; k < getNumberFolders(); k++) {
    printf("DEBUG INLOOP %d - Return from getFolderName is: %s\n",k, getFolderName(k));


    draw_sprite(k*60 + 30, 50, folder);

    //draw_string(temp[i].name,i*60 + 30, 50);

}

}

基本上,在 DEBUG1 和 DEBUG2 中,我的函数 getFolderName() 似乎工作得很好,即返回一个字符串,没有任何问题。然而,当我尝试在 for 循环中调用这个函数时,我从 getFolderName 得到的都是垃圾(除了第一个),即使 k 是 3 或 5(我之前测试过的情况) for 循环并且工作正常)。 k 没有错,因为我也打印了它。 getFolderName 对数组没有任何作用,函数如下:

char* getFolderName(int index) {
printf("Values inside getFolderName() function : %s\n", currentFolders[index].name);
return currentFolders[index].name ;

}

此外,显示 currentFolders 是什么也可能很重要:

typedef struct Directories {

    char* name;
    int active;

} Directory;

Directory currentFolders[30];

输出

Dec 20 22:18:48 192 kernel: Vai chamar o getSubFolder
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: .
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: ..
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: usr
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: lab4
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: proj
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: bin
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: boot
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: dev
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: etc
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: home
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: mnt
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: root
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: sbin
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: tmp
Dec 20 22:18:48 192 kernel: Values inside getSubFolders function: var
Dec 20 22:18:48 192 kernel: DEBUG 0Values inside getFolderName() function : lab4
Dec 20 22:18:48 192 kernel: DEBUG 1 - Return from getFolderName is: lab4
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : bin
Dec 20 22:18:48 192 kernel: DEBUG 2 - Return from getFolderName is: bin
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : .
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 0 - Return from getFolderName is: .
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 1 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 2 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 3 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 4 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 5 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 6 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 7 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 8 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 9 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 10 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 11 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 12 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 13 - Return from getFolderName is: 
Dec 20 22:18:48 192 kernel: Values inside getFolderName() function : 
Dec 20 22:18:48 192 kernel: DEBUG INLOOP 14 - Return from getFolderName is: 

我认为调用的其他函数与问题无关,但您可能想看一下,所以无论如何:

  int getSubFolders(char* foldername) {
    num_folders = 0;

    struct dirent *de=NULL;
      DIR *d=NULL;

      d=opendir(foldername);
      if(d == NULL) {
        perror("Couldn't open directory");
        return(2);
      }

      int i = 0;
      // Loop while not NULL
      while(de = readdir(d)) {
        num_folders++;
        Directory temp;
        currentFolders[i].name = de->d_name;

        strcpy( currentFolders[i].name, de->d_name);

//      printf("nome %s\n",de->d_name);

        //printf("temp.name %s\n",temp.name);

      //  currentFolders[i] = temp;

        printf("Values inside getSubFolders function: %s\n",currentFolders[i].name);

        i++;
      }

      printCurrentFolders();

      closedir(d);
      return(0);

}

最佳答案

这样修复它,结构体这样声明

typedef struct Directories {
    char name[256];
    int active;
} Directory;

并删除此行

currentFolders[i].name = de->d_name;

该问题是由 linedir(d); 清理 opendir 使用的资源引起的,struct dirent * 是这些资源的一部分.

关于c - 结构数组的值突然改变(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584610/

相关文章:

c - 字符串数组,其中行数由用户在 C 中输入

c - 结构体中的数组;如何使我的代码更加简洁?

javascript - js : loop through array indefinetly

python - 在 python 2.7 中将包含 datetime.timedelta 的 numpy 数组转换为秒的优雅方法

c++ - struct 中的 std::string - 复制/分配问题?

c++ - 数组的值随机变化

c - 最有效的动态排序方法

C - 为什么我的数组被覆盖了?

c++ - 访问结构中定义的枚举值

c - C 中的数学函数