使用 strt_ok 后释放变量时出现分段错误
Segmentation fault when free the variable after using strt_ok
我在执行这个简单的程序时出现段错误(它只是一个重现错误的轻量级版本)。
// gcc main.c -Wall -Wextra -Wpedantic
// ./a.out
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h> // uint32_t
int main(){
char* rest = (char*)malloc(128 * sizeof(char));
char* token= (char*)malloc(128 * sizeof(char));
strcpy(rest,"Something_else");
token = strtok_r(rest, "_", &rest);
printf("%s\n", token);
free(token);
free(rest);
return 0;
}
变量token
的free
没有报错。每次使用函数 strok_r
时,变量 rest
的 free
总是给我一个分段错误。到底是怎么回事?有什么建议吗?
编译时不提示警告。
问题:
如何正确地重写这个简单的代码?
您不应分配或释放变量 'rest'。 strtok_r 使用它的第三个参数来存储它在原始字符串中到达的位置。
所以:
char* rest;
char* copy= (char*)malloc(128 * sizeof(char));
strcpy(copy,"Something_else");
char* token = strtok_r(copy, "_", &rest);
// ...
free( copy); // don't free token or rest
你只需要记住句子,token
和rest
只是指针。
并使用 while
循环,您可以看到所有标记:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h> // uint32_t
int main(){
char* rest , *token;
char* setence= malloc(128 * sizeof(char));
strcpy(setence, "Some_thing_else");
token = strtok_r(setence, "_", &rest);
while (token)
{
printf("%s\n", token);
token = strtok_r(NULL, "_", &rest);
}
free(setence);
return 0;
}
将给予:
Some
thing
else
我在执行这个简单的程序时出现段错误(它只是一个重现错误的轻量级版本)。
// gcc main.c -Wall -Wextra -Wpedantic
// ./a.out
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h> // uint32_t
int main(){
char* rest = (char*)malloc(128 * sizeof(char));
char* token= (char*)malloc(128 * sizeof(char));
strcpy(rest,"Something_else");
token = strtok_r(rest, "_", &rest);
printf("%s\n", token);
free(token);
free(rest);
return 0;
}
变量token
的free
没有报错。每次使用函数 strok_r
时,变量 rest
的 free
总是给我一个分段错误。到底是怎么回事?有什么建议吗?
编译时不提示警告。
问题:
如何正确地重写这个简单的代码?
您不应分配或释放变量 'rest'。 strtok_r 使用它的第三个参数来存储它在原始字符串中到达的位置。 所以:
char* rest;
char* copy= (char*)malloc(128 * sizeof(char));
strcpy(copy,"Something_else");
char* token = strtok_r(copy, "_", &rest);
// ...
free( copy); // don't free token or rest
你只需要记住句子,token
和rest
只是指针。
并使用 while
循环,您可以看到所有标记:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h> // uint32_t
int main(){
char* rest , *token;
char* setence= malloc(128 * sizeof(char));
strcpy(setence, "Some_thing_else");
token = strtok_r(setence, "_", &rest);
while (token)
{
printf("%s\n", token);
token = strtok_r(NULL, "_", &rest);
}
free(setence);
return 0;
}
将给予:
Some
thing
else