- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道这是否是好的做法:
我已经阅读了一些关于 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/
我正在使用 asprintf(&somestring,"%s%s",stringone,stringtwo) 来连接字符串。如果我调用一次然后调用 free(somestring) 一次,它工作正常。
我想创建这样的东西: void funkcja(char *charTmp2){ asprintf(&charTmp2, "%i %.2f %s", 2, 3.20, "PIERWSZY");
下面是摘自“21 世纪 C”的片段。如果我在宏 Sasprintf 中使用 free(tmp_string_for_extend) 而不是 free(write_to) 释放内存,我无法弄清楚为什么程
GNU 函数 asprintf(打印到分配的字符串)是线程安全的吗? (IIC,基本上,这归结为 malloc 是否线程安全的问题。) 考虑示例代码: #define _GNU_SOURCE #inc
发现此代码,它需要停止将戴尔笔记本电脑中的 CPU 节流到 20%,这是由于计算机无法识别电源适配器而发生的。 尝试在 Kubuntu 上编译并得到: warning: implicit declar
我想以这种形式显示一个字符串:“在 3 天 00:15:07 内”或“在 00:15:07 内”在天数为 0 的情况下 所以我写了一些代码如下 #include #define LEASE_TIME_
我使用 asprintf 动态分配内存并加载字符串以存储有关工作目录中文件的信息。 在函数 parse_entry 的第 273 次(完全一致)调用中,此行被执行:file->filename_len
我想知道这是否是好的做法: 在函数内从数据库中获取字符串 使用 asprintf 为要存储在传递给函数的结构中的此字符串分配内存 我已经阅读了一些关于 C 中的内存管理和内存泄漏的帖子和文章。除此之外
asprintf说 The functions asprintf() and vasprintf() are analogs of sprintf(3) and vsprintf(3), except
我有这样的代码:我分配了两次 log,第一个 &log 是否有潜在的内存泄漏? char *log = NULL; asprintf(&log, "Hello: %s", name); if (kno
我有以下代码在同时使用 asprintf 和 realloc 时不起作用。 我得到的错误是: *** glibc detected *** a.out: realloc(): invalid old
我有以下代码在同时使用 asprintf 和 realloc 时不起作用。 我得到的错误是: *** glibc detected *** a.out: realloc(): invalid old
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
在我的 autoconf 脚本中: AC_CHECK_FUNC([asprintf], [CONFIGFLAGS+=" -DCB_HAVE_ASPRINTF"], [] ) 这就通过了
我正在尝试学习 C 并希望使用 union。它在我正在寻找的教程中看起来很简单,虽然没有使用 char * 但我不认为它会有所作为。 下面是我的 union 是如何声明的: union MyData
这是一段基于简单结构在套接字上写入 HTTP 响应的代码 void write_response(request *req, response *resp, int socket) { char
我写了一个 C 程序,它在 linux 上运行得很好,但是当我在 windows 上编译它时,它给我一个错误,说 asprintf() 是未定义的。它应该是 stdio 库的一部分,但似乎许多编译器不
我需要一个返回格式化字符串最终长度的 C 函数,这样我就可以正确分配目标字符串,而不是自己计算长度。有 snprintf 可以在无法写入整个字符串时执行此操作,但不幸的是,它没有宽字符替代方案。 sw
我正在尝试在 AIX 上构建 python-kerberos。 kerberospw.c 使用对 asprintf 的调用,但根据 Google 告诉我的信息,asprintf 在 AIX 上不存在。
我很难理解您为什么需要 asprintf。在手册中它说 The functions asprintf() and vasprintf() are analogs of sprintf(3) and v
我是一名优秀的程序员,十分优秀!