用strtok()标记字符串会导致c中的崩溃

用strtok()标记字符串会导致c中的崩溃,c,string,segmentation-fault,tokenize,strtok,C,String,Segmentation Fault,Tokenize,Strtok,我试图创建一个函数,用给定的delimeters标记给定的字符串,将标记放入2D字符数组并返回它。下面显示代码: char** stringTokenizer(const char* str, const char* delims){ char** tokens; size_t len = strlen(str); char localstr[len+1]; int tokenslen=0; strcpy(localstr,

我试图创建一个函数,用给定的delimeters标记给定的字符串,将标记放入2D字符数组并返回它。下面显示代码:

char** stringTokenizer(const char* str, const char* delims){
       char** tokens;
       size_t len = strlen(str);
       char localstr[len+1];
       int tokenslen=0;
       strcpy(localstr, str);
       tokens=malloc(sizeof(char*));

       char* tmp = strtok(localstr, delims);
       while(tmp){
                  if(++tokenslen>1) realloc(tokens, tokenslen*sizeof(char*));
                  tokens[tokenslen-1]=malloc((strlen(tmp)+1)*sizeof(char));
                  strcpy(tokens[tokenslen-1],tmp);
                  tmp = strtok(NULL, delims);
       }
       if(tokenslen==0){
                        free(tokens);
                        return NULL;

       } else return tokens;
}
当我尝试打印任何代币时,我都会崩溃

只要有令牌,我就增加令牌数组的大小,并为要复制的令牌分配指针

有什么建议吗

谢谢

试试这个

char** stringTokenizer(const char* str, const char* delims){
       char** tokens = NULL;
       size_t len = strlen(str);
       char localstr[len+1];
       int tokenslen=0;
    char **temp;//Change
       strcpy(localstr, str);

       //tokens=malloc(sizeof(char*));

       char* tmp = strtok(localstr, delims);
       while(tmp){
                  //if(++tokenslen>1) realloc(tokens, tokenslen*sizeof(char*));
    temp = realloc(tokens, tokenslen*sizeof(char*));
    tokens = temp;
                  tokens[tokenslen-1]=malloc((strlen(tmp)+1)*sizeof(char));
                  strcpy(tokens[tokenslen-1],tmp);
                  tmp = strtok(NULL, delims);
       }
       /*if(tokenslen==0){
                        free(tokens);
                        return NULL;

       } else*/ return tokens;
}

谢谢@netcoder

realloc(令牌,令牌长度*sizeof(char*)):删除返回值。您需要将realloc的返回值捕获到变量中。Realloc可以更改令牌指向的地址to@ChrisKon ; realloc不能保证扩展原始地址的剩余内存。最好是@BLUEPIXY将其作为答案发布,这样您就可以将问题标记为已回答。@Varun:不要编辑问题来提供答案。这有一个答案部分。我回滚了你的编辑(我想批准它的评论员有点高兴)。