想要在strtok之后释放我的指针令牌

时间:2012-02-10 15:27:19

标签: c char free strtok

我已经提取了代码的“含义”部分(并且还替换了一些行来简化它)。

我有2个动态指针,一个用于当前行(从文件中提取),另一个用于当前令牌。 关注此问题,Free/delete strtok_r pointer before processing complete string? 我写了这个:

int main(void) {
    int n = 455;  
    char *tok2, *freetok2;
    char *line, *freeline;

    line = freeline = malloc(n*sizeof(*line));
    tok2 = freetok2 = malloc(n*sizeof(*tok2));

    /* content of the file) */
    const char* file_reading =  "coucou/gniagnia/puet/";

    /* reading from the file */
    strcpy(line, file_reading);

    strtok(line, "/");
    /* get the second token of the line */
    tok2 = strtok(NULL, "/");

    fprintf(stdout, "%s \n", tok2); // print gniagnia
    fprintf(stdout, "%s \n", line); // print coucou

    /* free error */
    //free(tok2);

    /* worked, but maybe don't free "everything ?" */
    //free(line);

    free(freetok2);
    free(freeline);

    return 0;
}

但最后,我不确定什么是正确的,我发现这个解决方案不那么优雅(因为使用了2个“保存变量”。

这是对的吗?有没有办法改善它? 感谢

编辑:更改了我的代码,(并且它将处理文件的所有行)

include <unistd.h>
include <stdlib.h>

int main(void) {
    char *tok2; 
    char *line; 

    /* content of the file) */
    const char* file_reading =  "coucou/gniagnia/puet/";
    const char* file_reading2 =  "blabla/dadada/";

    /* reading from the file */
    line = strdup(file_reading);

    strtok(line, "/");
    /* get the second token of the line */
    tok2 = strtok(NULL, "/");

    printf("%s \n", tok2);
    printf("%s \n", line);

    /* reading from the file */
    line = strdup(file_reading2);

    strtok(line, "/");
    /* get the second token of the line */
    tok2 = strtok(NULL, "/");

    printf("%s \n", tok2);
    printf("%s \n", line);

    free(line);

    return 0;
}

2 个答案:

答案 0 :(得分:5)

您实际上并没有使用freetok2指向的内存,您不需要malloc任何内容,因此您不需要freetok2变量。

在您的代码中说free(line)free(freeline) 是相同的,因此您根本不需要freeline

另一个问题是:malloc(n*sizeof(*line));。您可能会说:malloc(n);因为sizeof(char)始终为1.但最重要的是:

line = malloc(strlen(file_reading) + 1);
strcpy(line, file_reading);

答案 1 :(得分:2)

代码应修改如下:

int main(void) {
    int n = 455;  
    char *tok2;
    char *line;

    line = malloc(n*sizeof(*line));

    /* content of the file) */
    const char* file_reading =  "coucou/gniagnia/puet/";

    /* reading from the file */
    strcpy(line, file_reading);

    strtok(line, "/");
    /* get the second token of the line */
    tok2 = strtok(NULL, "/");

    fprintf(stdout, "%s \n", tok2); // print gniagnia
    fprintf(stdout, "%s \n", line); // print coucou

    free(line);
    return 0;
}