sqlite3_exec()函数引发的血案

我们首先来看看sqlite3_exec()函数的原型:

1
2
3
4
5
6
7
SQLITE_API int SQLITE_STDCALL sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

第一个参数是打开sqlite3数据库句柄,第二个参数是你要执行的sql语句,第三个参数是每次查询所调用的回调函数,第四个参数是我们传入的参数,假如说我们在回调函数中找到了我们需要的数据,那么我们就可以通过这个指针来反馈给我们的调用者,第五个参数是调用sqlite3_exec发生错误时候的描述。

关于函数返回局部指针变量的思考

早先在博客文章 《在Linux下获得程序运行的绝对路径》 当中写到的获取当前运行路径的程序,在编译的时候会提示: warning : address of local variable ‘current_path’ returned [-Wreturn-local-addr] 大概意思就是说current_path是局部指针,如果返回的话,因为函数结束后会释放掉指针指向的地址空间,所以提示这个警告。 举个例子: 1 2 3 4 5 6 char *Func() { char buff[50]; buff="fuckyou"; return buff; } 最后调用这个函数并不会返回我们指定的字符串,但是在我们获得路径的程序里面却能够正常返回,这是为什么呢? 回想之前文章里面为保存路径所分配的数组大小是 1024,缩小成 50 也是会得到如上错误。 其实这个写法本身就是错误的,因为我们的程序只是恰好在访问到未被覆盖的内存地址而已。 引用 CSDN C 语言版主 paschen 的 说法 这是一种不确定行为,你输出的值和函数中的一样只能说明他该值还未被其他值覆盖,如果你调用其他函数等,之前指针所指的内存可能就被其他数据覆盖了,所以不要返回局部变量的指针 所以请严格按照 C++ Primer 4th 的 p214~p215 的说法,千万不要返回局部对象的引用或者局部对象的指针,因为一旦函数执行完毕之后会销毁掉!

在Linux下获得程序运行的绝对路径

我们要在 Linux 下使用 C 语言获得当前程序路径的话,需要使用到 readlink() 函数,这个函数在头文件 unistd.h 当中定义,使用的时候记得一定要引用哦。 原理很简单,因为 Linux 系统中有个符号链接: /proc/self/exe 它代表当前程序,所以我们使用函数 readlink() 就能读取到当前程序运行时的绝对路径了。 readlink() 函数有三个参数,第一个为路径,第二个为保存信息的 char buffer,第三个为 buffer 的长度,他的返回值是不包含字符串结尾(\0)的长度。

Clion 引用第三方库

Clion 是 Jetbrains公司所推出的新一代跨平台 C++ IDE,弥补了 Linux 平台上面 IDE 不强的局面。 Clion 基于 CMAKE 进行编译操作,但是 Clion 与 Intellij 不同,Clion 并没有图形化的第三方库引用界面,只有通过对 CMakeList.txt 进行手动链接才可以引用第三方库。

WinForm 图标复用,减少exe文件体积

经常我们使用C#开发windows窗体程序的时候,会使用到图标,但经常会碰到这样一个问题。 如果我们在项目属性中设定了一个50kb的ico图标,但是我们为了每个窗体的美观都需要在每个窗体又要使用相同的图标文件,这样的话,如果我们有3个窗体,就需要3个图标150KB,加上项目图标就是200KB,如果你有很多窗口的话,那么就会更加蛋疼。 解决办法就是在每个窗体的ico图标我们直接使用项目的那个50kb的图标就行了,避免重复添加。 只需要在每个窗口的laod事件里面手动加载图标即可。 1 2 3 4 5 private void Form1_Load(object sender, EventArgs e) { // 加载图标 this.Icon = Zony_Lrc_Download_2._0.Resource1._6; }
Built with Hugo
主题 StackJimmy 设计