C 函数来释放字符串数组 背景故事:

C 函数来释放字符串数组 背景故事:,c,memory-management,malloc,free,C,Memory Management,Malloc,Free,我创建了一个函数来销毁c中的字符串数组 我将指向数组的指针传递给这个函数,首先释放单个字符串,然后释放数组本身 运行该程序时,出现以下错误: tokenDemo(4967,0x11afeb5c0) malloc: *** error for object 0x7fde73c02a05:pointer being freed was not allocated tokenDemo(4967,0x11afeb5c0) malloc: *** set a breakpoint in malloc_er

我创建了一个函数来销毁c中的字符串数组

我将指向数组的指针传递给这个函数,首先释放单个字符串,然后释放数组本身

运行该程序时,出现以下错误:

tokenDemo(4967,0x11afeb5c0) malloc: *** error for object 0x7fde73c02a05:pointer being freed was not allocated
tokenDemo(4967,0x11afeb5c0) malloc: *** set a breakpoint in malloc_error_break to debug
Abort trap: 6
我几乎可以肯定我传中了正确的指针。我错过了什么

守则:
#包括
#包括
#包括
#包括“token.h”
#定义MAXLEN 100
int main(){
//用于标记化的分隔符
char sep[4]={',','''','''\n'};
char*strin=(char*)malloc(MAXLEN*sizeof(char));
printf(“输入句子:\n”);
fgets(strin,(最大值+1),标准值);
字符**标记=StringToToTokens(strin,sep);
int i=0;
while(令牌[i]!=NULL){
反向(代币[i]);
printf(“%s”,代币[i]);
i++;
}
printf(“\n”);
printf(“令牌:%d\n*令牌:%s\n”,令牌,*令牌);
销毁代币(代币);
自由(斯特林);
}
#define MAX 100//这是可以标记的最大字数
char**stringToTokens(char*str,char*sep){
//指针数组的malloc空间
char**tokenArray=(char**)malloc(MAX*sizeof(char*));
char*token=strtok(str,sep);
整数计数=0;
while(令牌!=NULL){
tokenArray[count]=令牌;
count++;//跟踪字数
token=strtok(NULL,sep);//获取字符串中的下一个令牌并将其设置为token
}
tokenArray[count]=NULL;//将NULL添加到最后一个元素
返回令牌数组;
}
void销毁令牌(字符**令牌数组){
//释放单个字符串
int i=0;
while(tokenArray[i]!=NULL){
免费(tokenArray[i]);
i++;
}
免费(令牌阵列);
}
无效反向(字符*s){
整数长度=strlen(s);
字符*开始,*结束,温度;
开始=秒;
结束=秒;
//现在实际移动字符串的末尾

for(int i=0;istrtok函数不分配内存。它返回传递字符串中指向char的指针。因此您不应该为它释放内存。这部分代码:

while(tokenArray[i] != NULL){ 
    free(tokenArray[i]);
    i++;
}

必须省略

还建议在
StringToToTokens
at
while(token!=NULL)中增加一点护甲
为了确保
计数
。旁注:同样重要的是,在这种情况下,
str
的源、
strin
不能在令牌数组仍在使用时被释放、超出范围,无论什么。在这种情况下,为
stringToTokens
中的令牌分配和管理新存储可能更好代码不应该被省略。这也是我所想的。但是,我的问题说明中包含了这一点:这个函数释放分配给字符串数组的内存,就像CreatedBystringToToToTokens一样。确保除了指针数组之外释放每个字符串。明白了。问题的答案是正确的,但是n如果我按照指示深度复制字符串,那么我必须释放用于深度复制的内存。谢谢!
while(tokenArray[i] != NULL){ 
    free(tokenArray[i]);
    i++;
}