You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:36:03