C语言分割64字符数组为两个32字符数组时输出异常如何解决
问题根源
C语言中printf使用%s格式符打印字符串时,会从传入的地址开始连续读取字符,直到遇到值为'\0'的空终止符才会停止输出。你的代码完全没有遵守C字符串的这个规范,才会出现打印内容超出数组长度的问题:
- 分配
IP_M内存时仅申请了64字节,刚好容纳64个有效字符,没有预留空终止符的位置,填充逻辑也没有在有效字符末尾追加'\0'。你能正常打印IP_M的完整内容纯属巧合:malloc分配的内存块后方紧邻的内存字节刚好为0,误打误撞充当了终止符。 L、R数组长度均定义为32字节,同样仅够存放32个有效字符,没有预留终止符位置;填充逻辑也只拷贝了32个有效字符,没有在数组末尾补'\0'。栈上局部变量默认连续分配,L数组的内存后方紧邻的就是R数组的内存,因此printf读完L的32个有效字符后找不到终止符,会继续向后读取R的内容,最终输出看起来和完整IP_M一致,和你用循环赋值还是memcpy拷贝没有任何关系。
修复方法
按以下步骤修改代码即可解决问题:
- 修改初始置换函数的内存分配逻辑,多申请1字节用于存放空终止符,填充完所有有效字符后手动追加终止符:
char *start_inital_permutation(const char *input) { // 总长度65字节:64字节存有效字符 + 1字节存空终止符 char *output = malloc(65 * sizeof(char)); for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { output[i * 8 + j] = input[IP[i][j] - 1]; } } output[64] = '\0'; // 手动标记字符串结束 return output; }
- 调整
L、R数组长度为33字节,填充完32个有效字符后同样在末尾追加空终止符:
char L[33]; // 32字节有效字符 + 1字节终止符 char R[33]; void fill_LR() { for (int i = 0; i < 32; i++) { L[i] = IP_M[i]; R[i] = IP_M[i + 32]; } L[32] = '\0'; R[32] = '\0'; }
注意:malloc申请的IP_M内存使用完后需要手动调用free(IP_M)释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者BOGDAN DONICI
相关产品推荐
相关产品推荐

