首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strtok和free

strtok和free
EN

Stack Overflow用户
提问于 2013-04-13 00:28:24
回答 2查看 1.8K关注 0票数 3

这样做有什么问题:

代码语言:javascript
复制
void *educator_func(void *param) {
char *lineE = (char *) malloc (1024);
size_t lenE = 1024;
ssize_t readE;

FILE * fpE;

fpE = fopen(file, "r");

if (fpE == NULL) {
    printf("ERROR: couldnt open file\n");
    exit(0);
}

while ((readE = getline(&lineE, &lenE, fpE)) != -1) {
    char *pch2E = (char *) malloc (50);

    pch2E = strtok(lineE, " ");

    free(pch2E);
}

free(lineE);
fclose(fpE);

return NULL;
}

如果我删除行'pch2E = strtok(lineE, " ");',它可以正常工作...

为什么我不能在那里做strtok()?我也尝试过strtok_r(),但没有成功,它给了我无效的空闲(地址0x422af10是一个1024空闲大小的块中的0字节)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-13 00:32:48

你的代码并没有做你认为它正在做的事情...对pch2E = strtok(lineE, " ");的调用将pch2E的值替换为strtok的返回值,该返回值可以是lineE,也可以是新分配的lineE的替代项

您可以按如下方式修复它:

代码语言:javascript
复制
int firstPass = 1;
while ((readE = getline(&lineE, &lenE, fpE)) != -1) 
{
    char* pch2E = strtok( firstPass ? lineE : NULL, " ");
    firstPass = 0;
}

free(lineE);

我应该补充的是,我越是看你的代码,它看起来就越有根本性的缺陷。您需要在代码中使用一个内部循环来处理令牌,而外部循环正在加载行……

代码语言:javascript
复制
while ((readE = getline(&lineE, &lenE, fpE)) != -1) 
{
    char* pch2E;
    int firstPass = 1;

    while( (pch2E = strtok( firstPass ? lineE : NULL, " ")) != NULL )
    {
        firstPass = 0;
        // do something with the pch2E return value
    }
}

free(lineE);
票数 2
EN

Stack Overflow用户

发布于 2013-04-13 00:44:51

strtok返回一个指向令牌的指针,该令牌包含在您传递的字符串中,因此您不能释放它,因为它并不(总是)指向您使用malloc分配的内容。

这种赋值甚至不能在C中工作,如果你想要一个将令牌复制到缓冲区中的函数,它应该是这样的:

代码语言:javascript
复制
tokenize(char* string, char* delimiter, char* token);

您需要将一个有效的指针传递给token,以便函数将数据复制到其中。在C中,要复制指针中的数据,函数需要访问该指针,因此函数不可能对返回值执行此操作。

另一种(但最糟糕的)策略是在内部分配内存的函数,并返回一个指向需要由调用者释放的内存区的指针。

对于您的问题,需要多次调用strtok来返回所有令牌,直到它返回null,所以它应该是:

代码语言:javascript
复制
while ((readE = getline(&lineE, &lenE, fpE)) != -1) {
    char *pch2E;

    pch2E = strtok(lineE, " "); //1st token

    while ((pch2E = strtok(NULL, " ")) != NULL) {
        //Do something with the token
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15976435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档