最近我在做一个涉及用 C 编写汇编程序的学校项目,我遇到了将指针传递给strtok
. 我克服了代码中的错误,但我想了解为什么我所做的事情不起作用。
下面是发生错误的函数的简化示例。
void processText(FILE *f) { //takes a file opened for reading.
char *token, *temp;
int len;
char buff[81]; //line buffer
while (fgets(buff, 81, f) != NULL) { //read in each line one at a time
len = strlen(buff);
token = strtok(buff, "#"); //first assignment
/*if there is a comment, strip and print it*/
if (len != strlen(token)) {
printf("comment: %s", strtok(NULL, "#"));
}
//len = strlen(token);
//temp = malloc(len + 1);
//strcpy(temp, token);
//token = strtok(temp, " ");
token = strtok(token, " "); //this segfaults...
printf("first word: %s\n", token);
//free(temp);
}
}
用上面的注释代码块替换有问题的行(并在最后释放 temp)解决了这个问题,但它显然需要我无缘无故地制作我的数据的额外副本,这让我想知道为什么我不能除非我以某种方式引用它,否则请使用现有数据。
据我了解,该strtok
函数分别接受参数char *
和const char *
。在我看来,在第一次分配之后,token
并且buff
应该看起来strtok
像char *
' 指向相同的位置——也就是说,strtok
作为它的第一个参数接收的值将是一个指向内存中保存该值的位置的指针无论我通过buff
哪个(buff
或)的第一个字符。token
我(松散地)理解这一点char[]
并且char *
根本不同,因为数组是静态分配的,指针是动态分配的,但我不明白为什么这在这种情况下会有任何不同,特别是考虑到系统对于从.strlen
strcpy
token
我很想了解这里发生了什么。在此先感谢您的时间!