【问题标题】:char has only the last pointerchar 只有最后一个指针
【发布时间】:2021-07-03 11:03:51
【问题描述】:

我将所有文件名(在本例中为文件夹 /Windows/Fonts/ 中的所有文件)放入 char File_Names。 Menawhile 名称也会被渲染,但是在我将所有内容都放入 char 之后(当 while 结束时),我尝试访问它并在其他东西中使用其中一个名称(这发生在 while 之后),但是我尝试的每一个指针只给出文件夹中的最后一个文件(这意味着它只有最后一个指针)。如何保留所有不同的文件名并在一段时间后使用它们? 这是我的程序的一个片段:

//-------------------- List files start
                  int File_Name_Y =  Font_Window_Y+35-Mouse_Scroll*10;
                  char *File_Names[4096];
                  struct dirent *entry;
                  DIR *dir = opendir("/Windows/Fonts");
                  int t = 1;
                  while ((entry = readdir(dir)) != NULL)
                    {
                      t += 1;
                      File_Names[t] = entry->d_name;
                      if (File_Name_Y <= Font_Window_Y+H-65 && File_Name_Y >= Font_Window_Y+30)
                        {
                          draw_text (Font_Window_X+15, File_Name_Y, File_Names[t], {1, 1, 1}, 1.5);
                        }
                      File_Name_Y += 20;
                    }
                  closedir(dir);
                  //------------------ List files end

                  if (use_button (SelectFontButton))
                    {
                      if (Mouse_Pressed)
                        {
                          Mouse_Pressed = 0;
                          char Font_Path[1024];
                          strcpy (Font_Path, "/Windows/Fonts/");
                          strcat(Font_Path, File_Names[3]);
                          strcpy (Global_Font, Font_Path);
                          printf (Global_Font);
                        }
                    }

【问题讨论】:

    标签: c++ pointers char


    【解决方案1】:

    您在每个条目中存储完全相同的值 entry-&gt;d_name。当然,它们都会指向同一个字符串。

    您可能会认为readdir entry-&gt;d_name 的值每次都更改为不同的值。但事实并非如此。每次,它都会将entry-&gt;d_name 的值设置为指向readdir 用来保存条目名称的同一个缓冲区。

    您需要保存实际名称,而不是指向由其他代码控制的缓冲区的指针。分配一个指针数组是不够的——实际的条目名称将存储在哪里?

    【讨论】:

    • 感谢您的回答,您介意澄清一下您的最后一段吗?
    • @PhilipAvramov 如果要保存每个名称,则需要实际为每个名称分配空间并将名称复制到您分配的空间中。但是你的代码所做的只是分配一堆指针,这些指针没有指向任何东西。 (您的代码在哪里分配内存来保存名称?您唯一的 malloc 调用仅分配仅包含指向其他事物的指针的指针。您从不为这些指针分配任何指向的东西。)
    • 哦,我明白了!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2018-12-12
    • 2018-04-05
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多