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

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. 修改初始置换函数的内存分配逻辑,多申请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;
}
  1. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:09:25