C - 我一直在用strtok()进行分离错误

时间:2017-04-05 20:50:50

标签: c

我想创建一个带有char *的函数,用strtok()标记它并返回带有所有参数的char **。每次尝试执行时,我都会收到Segmentation Fault错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



#define LENGTH  10

char ** boom(char * line, int * lng){
    size_t size = strlen(line )+1;
    int tksize = *lng;
    const char d[2] = " ";  
    char a[size];
    memcpy(a, line , size);

    char ** tk = (char**) malloc(tksize*sizeof(char*));
    int i=0;
    char* token = strtok(a, d);
    while(token!=NULL){
        tk[i] = token;
        i++;        
        token = strtok(NULL, d);
    }
    return tk;
 }

int main(void){

    int i, lng = LENGTH;
    char * string = "this is a beutiful message.\0";
    char ** tk = boom(string , &lng);

    for (i=0; i<lng; i++){  
        printf("%s\n", tk[i]);      
    }

    return 0;
}

我需要返回类型的boom()为char **,所以我还没有使用返回类型的char * []。我怀疑它是char ** malloc.Thanks的帮助。

2 个答案:

答案 0 :(得分:1)

strtok对局部变量char a[size]进行操作,因此char* token = strtok(a, d)将指向堆栈上分配的内存。函数boom完成后,此内存将不再有效,这就是段错误的原因。

答案 1 :(得分:0)

char a[size];是一个分配了自动存储持续时间的数组,这意味着一旦从该函数返回,a就会被释放。由于您使用a而不是linestrtok,因此函数boom返回的值是指向不再能够访问的内存部分的指针数组

编辑:strtok用于处理可写字符串,因此char * string = "...";函数中的main并非真正正确(字符串文字不可写),这可能是为什么你首先需要a。如果使用char string[] = "...";代替,那么事情就可以在不需要数组a的情况下工作,因为字符串文字中的字符将被复制到足够大小的数组中。您只需在line函数中使用a代替boom

如果您希望它也使用只读字符串,您还需要将tk数组中的每个项目分配为char的数组(即{{1在i = 0到tk[i] = malloc(toklen * sizeof *tk[i]);)的循环中:

tksize