【问题标题】:Can I/ Should I free pointer returned by strtok我可以/我应该释放 strtok 返回的指针吗
【发布时间】:2017-01-09 23:53:40
【问题描述】:

所以我动态地创建了一个字符串数组。然后,我为该数组中的每个元素分配一个通过调用 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);

【问题讨论】:

  • 我为我的低层 c 道歉,因为我在 java 中编程太多了

标签: c string pointers memory-management free


【解决方案1】:

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

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

【讨论】:

  • 所以我不会在循环的下一次迭代中出现内存泄漏?
  • 如果不分配任何东西,怎么会发生内存泄漏?
  • 我怎么会这么笨。。只是发生了
  • @Javant 不要责怪自己。我认为这是一个很好的问题,大多数来自java 的人都有(或应该)有这样的问题!那就是我为你投票!
【解决方案2】:

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

引用ref of strtok()

返回值

如果找到标记,指向标记开头的指针。否则为空指针。空指针总是 当字符串结尾(即空字符)为 到达正在扫描的字符串中。

ref 的示例并没有释放 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()的次数一样多。

【讨论】:

  • 但有时函数会在内部调用malloc()。例如,strdup()
  • 又一个非标准的 c 函数 BarmaR,但是总的来说你是对的。然而问题是关于strtok()。我希望我回答了你的担心。让我们尽量保持对c 的初学者的合理性! :)
【解决方案3】:

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

你没有分配argvNew中的指针指向的东西,所以你不会去free()他们。

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 2010-09-14
    • 1970-01-01
    • 2015-06-17
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多