为什么这段C++代码的char数组需要使用static修饰符?
关于uint8转二进制字符串函数中static限定符的作用说明
const char * u8_to_bstr(const uint8_t & u8) { static char s[9]; // space for 8-char string s[8] = 0; // terminate string char * sp = s; for (uint8_t xbit = 0b10000000; xbit > 0; xbit >>= 1) { cout << s << endl; *(sp++) = ((u8 & xbit) == xbit) ? '1' : '0'; } return s; }
static修饰的核心作用
局部变量的存储位置会直接决定它的生命周期,这就是移除static后出现异常的根本原因:
- 加
static时,s数组属于静态局部变量,存储在程序的静态数据区,生命周期和整个程序运行周期一致,函数调用结束后这块内存不会被释放,所以返回指向s的指针是合法的,外部可以正常访问到生成的二进制字符串。 - 去掉
static时,s数组属于普通局部变量,存储在函数的栈帧中,函数执行完毕返回时,当前栈帧会被操作系统回收,这块内存的内容会被后续的其他函数调用覆盖,拿到的返回指针属于野指针,访问野指针属于C++的未定义行为,就会出现乱码、随机值、程序崩溃等奇怪现象。
额外说明
当前用static的实现本身也有局限性:因为静态存储区的s是全局共享的,多次调用该函数会覆盖之前存储的内容,如果连续调用两次函数保存两个返回指针,最后两个指针指向的内容都会是最后一次调用的结果。如果需要避免这个问题,可以让调用方提前传入缓冲区存储结果,或者返回std::string容器自动管理内存。
内容的提问来源于stack exchange,提问作者LittleHouses
相关产品推荐
相关产品推荐

