从.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
相关产品推荐
相关产品推荐

