在结构中设置char*字段,C语言
假设我有以下结构:在结构中设置char*字段,C语言,c,C,假设我有以下结构: typedef struct body{ char* text; } body_t; 我想写一个函数,它允许我将body结构的文本设置并获取为我传递给它的字符串。我编写了以下函数: void body_set_text(body_t* body, char* text){ if(body->text != NULL){ free(body->text); } body->text = text; } cha
typedef struct body{
char* text;
} body_t;
我想写一个函数,它允许我将body结构的文本设置并获取为我传递给它的字符串。我编写了以下函数:
void body_set_text(body_t* body, char* text){
if(body->text != NULL){
free(body->text);
}
body->text = text;
}
char* body_get_text(body_t* body){
return body->text;
}
正文中的文本字段可以是多个字符或单个字符。我想使用body_set_text函数来修改给定用户输入的单个字符的文本。我编写了以下函数:
void process_player_entry(body_t* body, char c){
char* new_char = malloc(sizeof(char));
snprintf(new_char, "%c", c);
body_set_text(body, new_char);
}
但是,这会引发堆缓冲区溢出错误。有人知道我做错了什么吗?正如其他人在评论中指出的那样,您的代码中还有一些其他问题。但是,您可以通过提供正确的参数使其工作:
// function signature
int snprintf(char *str, size_t size, const char *format, ...);
// the second argument is "size"
void process_player_entry(body_t* body, char c){
// change here to "2", so you have space for the character and
// the NULL terminator
char* new_char = malloc(2);
// so changing here should be fine
snprintf(new_char, 1, "%c", c);
body_set_text(body, new_char);
}
从手册中:
函数snprintf()和vsnprintf()将最大大小的字节(包括终止的空字节('\0'))写入str
snprintf的第二个参数应该是一个大小。要保存长度为N的字符串,必须分配至少为N+1的缓冲区。大小为1的缓冲区不能容纳字符串,长度为0的普通字符串除外。
free(NULL)
是完全安全的。在调用free
之前,检查指针是否非空没有实际意义。请注意,如果调用body\u set\u text(某物,“hello”)
,那么下一次调用body\u set\u text(某物…)
将失败,因为您无法free(“hello”)
。