使用strt_ok

时间:2019-06-26 09:17:05

标签: c segmentation-fault malloc free

在执行此简单程序时,我遇到了段错误(只是错误的轻量版本)。

//   gcc main.c -Wall -Wextra -Wpedantic
//   ./a.out

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h> // uint32_t

int main(){

    char* rest = (char*)malloc(128 * sizeof(char));
    char* token= (char*)malloc(128 * sizeof(char)); 
    strcpy(rest,"Something_else");
    token = strtok_r(rest, "_", &rest);
    printf("%s\n", token);
    free(token);
    free(rest);
    return 0;
}

变量free的{​​{1}}没有给出任何错误。每次使用函数token时,变量free的{​​{1}}总是给我带来分段错误。到底是怎么回事?有什么建议吗? 编译时无警告提示。

问题

如何正确地重新编写此简单代码?

2 个答案:

答案 0 :(得分:5)

您只需要为句子存储空间,tokenrest只是指针。

使用while循环,您可以看到所有令牌:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h> // uint32_t

int main(){

    char* rest , *token;
    char* setence= malloc(128 * sizeof(char)); 

    strcpy(setence, "Some_thing_else");

    token = strtok_r(setence, "_", &rest);

    while (token) 
    {
        printf("%s\n", token);
        token = strtok_r(NULL, "_", &rest);          
    }

    free(setence);

    return 0;
}

会给:

Some
thing
else

答案 1 :(得分:2)

您既不应分配也不不应释放变量“ rest”。 strtok_r使用其第三个参数存储它在原始字符串中到达的位置。 所以:

char* rest;
char* copy= (char*)malloc(128 * sizeof(char)); 
strcpy(copy,"Something_else");
char* token = strtok_r(copy, "_", &rest); 
// ...
free( copy);  // don't free token or rest