gpt4 book ai didi

mysql - 在另一个函数中使用 asprintf 为字符串分配内存

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:17 25 4
gpt4 key购买 nike

我想知道这是否是好的做法:

  • 在函数内从数据库中获取字符串
  • 使用 asprintf 为要存储在传递给函数的结构中的此字符串分配内存

我已经阅读了一些关于 C 中的内存管理和内存泄漏的帖子和文章。除此之外,我还读到在函数内部分配内存被认为是不好的,但是我应该如何分配内存main,如果我在函数内部时只知道要分配多少内存,因为要分配的内存大小取决于数据库中字符串的长度?

typedef struct{
int age;
char * name;
}my_struct;

bool get_data(my_struct * p){
bool succes=false;

if(mysql_real_connect(my, "localhost", SQL_USER, SQL_PASS, SQL_BASE, 0, NULL, 0) == NULL){
fprintf(stderr,"MYSQL-connection error!");
success=false;
}

if(mysql_query(my, "SELECT * FROM Persons WHERE id=1")){ // Assume this would be where the real data came from
fprintf(stderr, "sql_query: %s\nfailed\n", query);
success=false;
}else{
MYSQL_RES * result=NULL;
result = mysql_store_result(my);

if(mysql_num_rows(result) == 1){
MYSQL_ROW row=NULL;
row=mysql_fetch_row(result);
p->age=atoi(row[1]);
if(asprintf(&p->name, "%s", row[2])==-1){
success=false;
p->name=NULL;
}else{
success=true;
}
}else{
success=false;
}
mysql_free_result(result);
}

mysql_close(my);
return(success);
}

void init_my_struct(my_struct * s){
s->age=0;
s->name=""; // This should be: s->name=NULL;
}

void reset_my_struct(my_struct * s){
if(s->name)free(s->name);
init_my_struct(s);
}

int main(int argc, char **argv){
my_struct person;
init_my_struct(&person);
if(get_data(&person)){
puts("OK");
}else{
puts("Not OK");
}
reset_my_struct(&person); // Frees memory if it was allocated
}

此外:我使用自己编写的函数来初始化和重置/销毁结构 my_struct,这可以被认为是安全的吗?还是内存损坏的定时炸弹?

最佳答案

这看起来不错,除了一件事:

void init_my_struct(my_struct * s){
s->age=0;
s->name=""; // assigns a const char * to s->name
}

在这里,您将 s->name 设置为非 NULL 值。空字符串与 NULL 不同。它是一个包含值 0 的单字符数组,即空终止符之前没有任何内容的空终止字符串。

如果你试图在给它赋值之前free(s->name),你可能会发生核心转储,因为常量字符串""没有返回malloc.

在函数内部分配内存很好,特别是如果计算需要多少内存是留给函数的任务时。但是您必须确保在函数调用后的某个时刻释放它。

关于mysql - 在另一个函数中使用 asprintf 为字符串分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com