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

C++如何覆写函数参数解决char数组写入访问违规问题

错误原因

  1. 你为filename参数设置的默认值是0(即空指针),当不传该参数调用fileOut时,函数内直接对空指针做写入操作,自然会触发写入访问违规。
  2. C++中数组作为函数参数会自动退化为指针,你写的char filename[15]形参本质是char* filename,直接执行cin >> filename本质是往指针指向的内存写入输入字符串,如果指针指向的内存空间不足、或是无效地址,都会触发内存错误。

解决方案

推荐方案:使用std::string传递参数

C++场景下优先用std::string处理字符串,不需要手动管理内存,也不会有缓冲区溢出风险,用指针或者引用传递即可实现外部变量修改:

#include <iostream>
#include <string>

int fileOut(bool output = true, std::string* filename = nullptr);

int fileOut(bool output, std::string* filename){
    // 先做指针合法性校验,避免空指针访问
    if (!filename) {
        // 支持不传filename的调用场景,用局部变量处理
        std::string local_name;
        std::cin >> local_name;
        std::cout << local_name;
        return 0;
    }
    std::cin >> *filename;
    std::cout << *filename;
    return 0;
}

// 调用示例
int main() {
    std::string fname;
    // 调用后fname会被赋值为输入的文件名
    fileOut(true, &fname);
    // 也可省略第二个参数调用:fileOut(true);
    return 0;
}

兼容char数组的方案

如果必须使用char数组,需要保证外部传入的数组有足够空间,同时做好空指针校验:

#include <iostream>

int fileOut(bool output = true, char filename[] = nullptr);

int fileOut(bool output, char filename[]){
    if (!filename) {
        char local_buf[256] = {0};
        std::cin >> local_buf;
        std::cout << local_buf;
        return 0;
    }
    // 用带长度限制的输入接口,避免缓冲区溢出,此处假设传入的数组长度为15
    std::cin.getline(filename, 15);
    std::cout << filename;
    return 0;
}

// 调用示例
int main() {
    char fname[15] = {0};
    // 调用后fname会被赋值为输入的文件名
    fileOut(true, fname);
    return 0;
}

注意事项

  • 要让函数修改外部传入的变量,必须传递指针或者引用,直接传值修改的只是函数内部的副本,外部不会生效
  • 禁止对空指针、未分配足够空间的指针做写入操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:06:02