在结构中设置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”)