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

访问函数传入的字符串引发栈缓冲区溢出,求C语言二进制转整数解决办法

解决栈缓冲区溢出问题并完成二进制字符串转整数

看起来你在处理反向比特流转整数时遇到了缓冲区溢出的问题,我来帮你拆解下问题所在,然后给出修复方案。

首先看你代码里的几个关键问题:

  • index_of_holder没有递增:你在循环里每次都把buffer[i]赋值给temp_holder[index_of_holder],但index_of_holder一直是0,这会导致三个字符都覆盖到同一个位置,最后temp_holder里只有最后一个字符(也就是buffer[0]),完全不是你想要的前3位反向后的字符串。
  • 缺少字符串终止符\0:C语言里的字符串必须以\0作为结束标记,你malloc了4个char的空间(足够存3个字符+1个终止符),但循环结束后没有添加这个终止符。后续如果用字符串函数(比如atoi)或者手动处理时,程序会一直读取内存直到找到\0,这就会触发栈缓冲区溢出。

修复后的代码方案

我给你调整下代码,同时优化内存使用(因为3个字符+终止符的空间很小,用栈数组比malloc更高效,还能避免忘记free的问题):

// 直接用栈上的数组,分配4个char空间(3位+终止符)
char temp_holder[4];
int index_of_holder = 0;

// 从buffer的第2位到第0位读取,也就是反向比特流的前3位转成正常顺序的二进制字符串
for(int i = 2; i >= 0; i--) {
    printf("%c", buffer[i]);
    temp_holder[index_of_holder++] = buffer[i];
}
// 必须添加字符串终止符,否则后续操作会越界
temp_holder[index_of_holder] = '\0';
printf("\n");

// 现在把二进制字符串转成整数
int decimal = 0;
for(int j = 0; j < 3; j++) {
    // 把字符'0'/'1'转成数字0/1,然后计算权重
    decimal += (temp_holder[j] - '0') * (1 << (2 - j));
}
// 或者用标准库函数strtol,注意指定基数为2
// int decimal = strtol(temp_holder, NULL, 2);

printf("转换后的整数:%d\n", decimal);

额外注意事项

  • 确保buffer本身是有效的:你要保证buffer至少有3个元素(索引0、1、2都能正常访问),如果buffer的长度不足,也会导致越界访问。
  • 内存管理(如果坚持用malloc):如果你还是想用动态分配的内存,记得在使用完后调用free(temp_holder);,避免内存泄漏。
  • 输入合法性:如果buffer里的字符不是'0'或'1',转换会出错,最好先做合法性检查,比如判断每个字符是否在'0'-'1'范围内。

这样调整后,就能避免缓冲区溢出的问题,同时正确完成二进制字符串到整数的转换啦。

内容的提问来源于stack exchange,提问作者Pembroke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:59:26