C语言实现unsigned short int转二进制不使用malloc()的方法
不用malloc实现unsigned int转二进制的两种方案
额外提醒:你现有代码中malloc只分配了16字节,实际需要存储的内容(16位二进制+1个分隔空格+字符串结束符)共需要18字节,存在缓冲区溢出风险,以下两种方案都修复了这个问题
方案1:调用方提前分配缓冲区(推荐)
这种方式内存管理逻辑清晰、线程安全,是工业界常用的实现形式:
#include <stdio.h> // 约定缓冲区最小长度:16位二进制+1个分隔空格+1个字符串结束符 #define BIN_BUF_LEN 18 // 第二个参数为调用方传入的缓冲区指针 void toBinary(unsigned n, char *buf); int main(void) { int n; // 直接在栈上分配缓冲区,不需要malloc也不需要手动释放 char binary[BIN_BUF_LEN]; printf("Enter an integer to convert: "); scanf("%d",&n); toBinary(n, binary); printf("%s",binary); return 0; } void toBinary(unsigned n, char *buf) { int j = 0; // 修复原代码1<<16在16位unsigned平台溢出的问题,从最高位15位开始遍历 for (unsigned i = 1U << 15; i > 0; i >>= 1) { if(j == 8) buf[j++] = ' '; buf[j++] = (n & i) ? '1' : '0'; } buf[j] = '\0'; }
- 优点:线程安全,支持多线程场景调用,栈内存自动回收不存在内存泄漏风险
- 注意点:需要提前约定缓冲区最小长度,避免传入的缓冲区过小导致溢出
方案2:使用静态数组存储结果
如果你不想修改原函数的参数、返回值结构,可以使用函数内部的静态数组实现:
#include <stdio.h> char *toBinary(unsigned n); int main(void) { int n; printf("Enter an integer to convert: "); scanf("%d",&n); char* binary = toBinary(n); printf("%s",binary); return 0; } char* toBinary(unsigned n) { // 静态数组生命周期和程序运行周期一致,不会随函数返回被销毁 static char buf[18]; int j = 0; for (unsigned i = 1U << 15; i > 0; i >>= 1) { if(j == 8) buf[j++] = ' '; buf[j++] = (n & i) ? '1' : '0'; } buf[j] = '\0'; return buf; }
- 缺点:线程不安全,多次调用函数会覆盖上一次的转换结果,比如连续两次调用toBinary,第一次拿到的指针指向的内容会被第二次的结果覆盖
- 适用场景:仅适合单线程、单次转换的简单测试场景
内容的提问来源于stack exchange,提问作者ulysessg
相关产品推荐
相关产品推荐

