我可以/我应该释放strtok返回的指针

时间:2016-09-02 00:25:21

标签: c string pointers memory-management free

所以我动态创建一个字符串数组。然后我通过调用strtok为该数组中的每个元素分配一个返回的指针。在我的过程结束时,我需要重做一切我试图释放所述数组元素中的指针,但我不断收到错误说明

*** glibc detected *** ./prgm: munmap_chunk(): invalid pointer: 0x00007fff600d98

另外,在循环结束时释放inputStr是否有意义?

我的逻辑“根本不合逻辑”在哪里思考错误... 例如代码

   char** argvNew = (char**)calloc(33,sizeof(char*));
   char inputStr[128];  
   do{    
        scanf("%127[^\n]%*c", inputStr);
        token = strtok(inputStr, delim);

        /* Add tokens to array*/
        varNum= 0;
        for(i = 0; token != NULL; i++){
            varNum++;
            argvNew[i] = token;
            token = strtok(NULL, delim);
        }
        argvNew[i] = NULL;

       //Free argvNew 
        for(i = 0; i < varNum;i++){
            printf("Deleting %i, %s\n",i,argvNew[i]);
            free(argvNew[i]);
        }
  while(1);

3 个答案:

答案 0 :(得分:6)

不,你不应该释放它。它返回指向inputStr(或NULL到达结尾时的字符的指针)。它没有分配任何新的内存,所以没有什么可以免费的。

如果inputStr是动态分配的,那么你应该在完成后释放它。

答案 1 :(得分:4)

不,因为它没有分配新内存。

引用ref of strtok()

  

返回值

     

如果找到令牌,指向令牌开头的指针。否则,为空指针。空指针总是如此   当字符串的结尾(即空字符)是时返回   到达被扫描的字符串。

参考的例子,并没有释放strtok()返回的内容,这证实了:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

您会看到返回的strtok()指针仅用于访问程序已创建的内存(无论是否是动态创建的内存;此处是静态创建的)。它不会被分配新创建的内存,因此你不应该释放它。

一般来说,这是你应该记住的:

在致电free()时多次致电malloc()

答案 2 :(得分:-1)

您只分配了argvNew数组。这是你唯一应该解除分配的东西。

您没有分配argvNew中指针指向的内容,因此您不会free()这些指针。