0

我有这个功能:

char * folderFromPath(char *path)
{
  printf("\nentered folderFromPath\n");

  char *token[80];
  int i = 0;  
  const int STR_LEN = 128;
  char str[STR_LEN];
  char *folder;
  folder = malloc(sizeof(path));
  strcpy(folder,"/");

  if (strlen(path) > STR_LEN)
  {
    printf("Warning: strlen(path) > STR_LEN, (%d > %d) in function folderFromPath\n", strlen(path), STR_LEN);
  }
  else
  {
      printf("path: %s\n", path);

    strcpy(str,path);

    token[0] = strtok(str, "/");

    while (token[i]!= NULL)
    {
      i++;
      token[i] = strtok (NULL, "/");
      printf("token[i]: %s, i: %d\n", token[i], i);
    }

    if (folder != NULL)
    {
        int j = 0;
        while (j < (i-1))
        {
              strcat(folder,token[j]);
              strcat(folder,"/");
            j++;
        }

        printf("folder: %s\n", folder);

    }

  } /* else if (strlen(path) < STR_LEN) */

  return folder;

}

在其中你可以看到我已经动态分配了指向的内存folder。您还可以看到该文件夹​​返回给调用函数。我在这篇文章中看到建议在调用函数中使用指针后释放指针。这就是我所做的。这是调用函数:

void open_activated(GtkWidget *widget, GtkWindow *parent)
{
  GtkSourceLanguage *lang;
  GtkSourceLanguageManager *lm;
  GtkWidget *dialog;
  GtkWidget *tablabel;
  GtkTextBuffer *tbuffer;
  int openTabs = 0;
  char *folder1;
  const gchar *folder2;
  int page = 0;
  char *path;

  page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
  path  = paths[notebookPages[page]];
  folder1 = folderFromPath(path);
  folder2 = folder1;

  dialog = gtk_file_chooser_dialog_new("Open File", parent, GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,NULL);
  gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog), folder2);
  free(folder1); 

  tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txtinput[openedPages]));

  gtk_source_buffer_begin_not_undoable_action(GTK_SOURCE_BUFFER(tbuffer));

  if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_ACCEPT)
  {

    ...

  } /* if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_ACCEPT) */

  gtk_widget_destroy(dialog);
  changeLabelColor("black");
  gtk_text_buffer_set_modified (gtk_text_view_get_buffer((GTK_TEXT_VIEW(txtinput[openedPages]))), FALSE);

  gtk_source_buffer_end_not_undoable_action(GTK_SOURCE_BUFFER(tbuffer));
  write_config_files();

  verifyPaths();  

}

当我尝试打开文件时,应用程序中止并生成以下语句:

*** glibc detected *** ./ledit: free(): invalid next size (fast): 0x082a80c8 ***

所以我的问题是这个错误是什么意思,我应该做些什么来正确释放指针?谢谢。

4

1 回答 1

2

主要问题大概就是这个。

char * folderFromPath(char *path)
...
folder = malloc(sizeof(path));

您正在分配sizeof(path),这与 相同sizeof(char*),因为path是 a char*。您只分配了足够的字节来保存一个指针,而不是整个路径,这可能是您想要的。

请尝试:

folder = malloc(strlen(path)+1);

很可能还有其他问题;我没有仔细看。它看起来好像你folder在将它传递给之后正确地释放了它gtk_file_chooser_set_current_folder(),虽然我不知道你为什么也将它分配给它folder2。如果您期望该分配复制字符串(GTK 函数是否期望获得路径的所有权?)那么您将感到失望;您将不得不使用strncpy()或类似的方式获取字符串的单独副本。

于 2012-06-05T23:38:46.613 回答