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

早先在博客文章 《在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; }

GCC零长数组与变长数组

一般我们如果碰到如下代码一般都会认为是错误的。 1 2 int a=10; int array[a]; 因为我们的书上明确说过,定义数组的时候,数组维度必须为常量表达式或者const的常量。 就像下面一样: 1 2 3 int array[10]; const int lenght=10; int array2[lenght]; 第一次我看到第一段代码的时候认为绝壁编译无法通过,刚好我又在Linux下开发程序,抱着怀疑的心态编译了一下,结果竟然通过了。当时我的人生观、价值观、世界观就被颠覆了,便在网上四处搜索答案,之后在 http://www.cnblogs.com/hazir/p/variable_length_array.html 找到了答案。 在 ISO/IEC9899 标准的 6.7.5.2 Array declarators 中明确说明了数组的长度可以为变量的,称为变长数组(VLA,variable length array)。(注:这里的变长指的是数组的长度是在运行时才能决定,但一旦决定在数组的生命周期内就不会再变。) 在 GCC 标准规范的 6.19 Arrays of Variable Length 中指出,作为编译器扩展,GCC 在 C90 模式和 C++ 编译器下遵守 ISO C99 关于变长数组的规范。 GCC 中允许使用零长数组,把它作为结构体的最后一个元素非常有用,下面例子出自 gcc 官方文档。 1 2 3 4 5 6 7 struct line { int length; char contents[0]; }; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length; 从上例就可以看出,零长数组在有固定头部的可变对象上非常适用,我们可以根据对象的大小动态地去分配结构体的大小。
Built with Hugo
主题 StackJimmy 设计