2012-06-05 48 views
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指向的内存。您也可以看到该文件夹​​被返回到调用函数。我看到了in this post,在调用函数中使用它后,建议释放指针。这就是我所做的。下面是调用函数:

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 *** 

所以我的问题是,这个错误是什么意思,我该怎么办不同地正确地释放指针?谢谢。

回答

2

主要的问题可能是这个。

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

您分配sizeof(path),这是一样的sizeof(char*),因为pathchar*。你只分配足够的字节来保存一个指针,而不是你想要的整个路径。

尝试,而不是:

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

有可能是其他问题;我没有看得很仔细。它看起来好像你在将它传递给gtk_file_chooser_set_current_folder()后正确地释放了返回folder,但我不知道你为什么将它分配给folder2。如果你期待这个任务复制字符串(GTK函数是否期望获得路径的所有权?),那么你会感到失望;您将不得不使用strncpy()或类似的东西来分别复制字符串。

+0

谢谢你,这是它。现在,我在打开文件时没有发生任何崩溃,之前我一直在崩溃。我在学。我将folder1分配到folder2的原因是将其转换为'gtk_file_chooser_set_current_folder()'预期的类型。这是一个排除故障的步骤,但我不知道还有什么可以尝试的。现在我已经完成了你所建议的改变,我发现这是没有必要的。再次感谢。 – nomadicME