所以我动态创建一个字符串数组。然后我通过调用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);
答案 0 :(得分:6)
不,你不应该释放它。它返回指向inputStr
(或NULL
到达结尾时的字符的指针)。它没有分配任何新的内存,所以没有什么可以免费的。
如果inputStr
是动态分配的,那么你应该在完成后释放它。
答案 1 :(得分:4)
不,因为它没有分配新内存。
返回值
如果找到令牌,指向令牌开头的指针。否则,为空指针。空指针总是如此 当字符串的结尾(即空字符)是时返回 到达被扫描的字符串。
参考的例子,并没有释放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()
这些指针。