这样做有什么问题:
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字节)
发布于 2013-04-13 00:32:48
你的代码并没有做你认为它正在做的事情...对pch2E = strtok(lineE, " ");的调用将pch2E的值替换为strtok的返回值,该返回值可以是lineE,也可以是新分配的lineE的替代项
您可以按如下方式修复它:
int firstPass = 1;
while ((readE = getline(&lineE, &lenE, fpE)) != -1)
{
char* pch2E = strtok( firstPass ? lineE : NULL, " ");
firstPass = 0;
}
free(lineE);我应该补充的是,我越是看你的代码,它看起来就越有根本性的缺陷。您需要在代码中使用一个内部循环来处理令牌,而外部循环正在加载行……
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);发布于 2013-04-13 00:44:51
strtok返回一个指向令牌的指针,该令牌包含在您传递的字符串中,因此您不能释放它,因为它并不(总是)指向您使用malloc分配的内容。
这种赋值甚至不能在C中工作,如果你想要一个将令牌复制到缓冲区中的函数,它应该是这样的:
tokenize(char* string, char* delimiter, char* token);您需要将一个有效的指针传递给token,以便函数将数据复制到其中。在C中,要复制指针中的数据,函数需要访问该指针,因此函数不可能对返回值执行此操作。
另一种(但最糟糕的)策略是在内部分配内存的函数,并返回一个指向需要由调用者释放的内存区的指针。
对于您的问题,需要多次调用strtok来返回所有令牌,直到它返回null,所以它应该是:
while ((readE = getline(&lineE, &lenE, fpE)) != -1) {
char *pch2E;
pch2E = strtok(lineE, " "); //1st token
while ((pch2E = strtok(NULL, " ")) != NULL) {
//Do something with the token
}
}https://stackoverflow.com/questions/15976435
复制相似问题