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

从.mm文件传字符串到.cpp文件运行时触发EXC_BAD_ACCESS错误求助

嘿,我一眼就瞅出你这代码里的问题了——触发EXC_BAD_ACCESS的核心原因是未初始化的指针数组直接进行内存拷贝,这属于C++里典型的未定义行为,所以错误出现的时机才会飘忽不定,完全取决于当前内存的随机状态。

具体问题出在哪?

看你.cpp文件里这段代码:

char *paramArray[argc];
int i=0;
while ( getline( iss, s, ' ' ) ) {
    strcpy(paramArray[i],s.c_str()); // 这里就是雷区!
    std::cout<<paramArray[i]<<std::endl;
    i++;
}

char *paramArray[argc]只是声明了一个能装argc个char*指针的数组,但数组里的每个指针都没指向任何有效的内存空间——它们的初始值是栈上的随机垃圾值。strcpy会硬把s.c_str()的内容写到这个随机地址上,要么直接访问了无效内存触发崩溃,要么覆盖了其他程序数据,什么时候炸完全看运气。

怎么修复?

给你两种靠谱的修复思路,按需选:

思路1:用C++标准库的容器(推荐,省心)

既然已经在用C++,别折腾C风格字符串的内存管理了,直接用std::vector<std::string>存参数,安全又省事:

int ZMain::zmain(int argc, std::string argv) {
    std::istringstream iss(argv);
    std::string s;
    std::vector<std::string> paramList; // 用vector自动管理内存
    
    while (getline(iss, s, ' ')) {
        paramList.push_back(s);
        std::cout << paramList.back() << std::endl;
    }

    // 如果后续需要C风格指针数组,也可以基于vector生成
    std::vector<char*> paramArray;
    for (auto& str : paramList) {
        paramArray.push_back(const_cast<char*>(str.c_str()));
    }
    // 注意:paramArray里的指针只在paramList的字符串有效时能用哦

    return 0;
}

思路2:手动分配内存(适合必须用C风格字符串的场景)

如果一定要用char*数组,必须给每个指针分配足够的内存,用完还要记得释放,避免内存泄漏:

int ZMain::zmain(int argc, std::string argv) {
    std::istringstream iss(argv);
    std::string s;
    char *paramArray[argc];
    int i=0;

    try {
        // 加个i<argc的判断,防止数组越界
        while (getline(iss, s, ' ') && i < argc) {
            // 分配能装下整个字符串+终止符的内存
            paramArray[i] = new char[s.size() + 1];
            strcpy(paramArray[i], s.c_str());
            std::cout << paramArray[i] << std::endl;
            i++;
        }
    } catch (...) {
        // 万一出错,先把已经分配的内存释放掉
        for (int j=0; j<i; j++) {
            delete[] paramArray[j];
        }
        throw;
    }

    // 使用完参数数组后,一定要释放内存
    for (int j=0; j<i; j++) {
        delete[] paramArray[j];
    }
    return 0;
}

额外提醒

  • 你用空格分割字符串的逻辑有个小坑:如果参数本身带空格(比如带引号的"hello world"),会被拆成两个参数,要是有这种场景,得写更复杂的解析逻辑。
  • 传入的argc可能和实际分割出的参数个数不匹配,所以循环里一定要加i < argc的判断,防止数组越界搞出别的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:08:29