访问函数传入的字符串引发栈缓冲区溢出,求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
相关产品推荐
相关产品推荐

