C++中复制静态数组到动态数组出现访问违规,求技术支持
代码错误排查与修复
错误原因
memcpy不适用于std::string对象复制:std::string是包含动态内存管理的复杂类型,memcpy仅做字节级浅拷贝,会导致两个数组中的string共享同一块堆内存,后续访问或析构时触发内存访问违规,这是Access violation报错的核心原因。- 变量
ausgabe未定义:代码直接使用ausgabe但未声明初始化,编译阶段会报错,需补充定义。 - 复制逻辑的冗余风险:
myArray长度为5,neuArray长度为6,用len*sizeof(string)复制5个string的字节到neuArray,虽不会直接越界,但核心问题仍为memcpy的误用。
修复后的代码
#include <iostream> #include <string> #include <algorithm> // 使用std::copy时需要包含 using namespace std; int main() { string myArray[5]; const int len = sizeof(myArray) / sizeof(myArray[0]); // 补充ausgabe的定义,替换为实际二进制字符串 string ausgabe = "0101"; myArray[0] = ausgabe; const int x = 5; const int y = 1; string neuArray[x + y] = {}; // 方案1:循环逐个复制,利用string赋值运算符实现深拷贝 for (int i = 0; i < len; ++i) { neuArray[i] = myArray[i]; } // 方案2:使用标准库std::copy(更简洁,推荐) // std::copy(myArray, myArray + len, neuArray); for (int i = 0; i < x + y; ++i) { cout << neuArray[i] << endl; } return 0; }
关键修复说明
- 替换
memcpy为循环赋值或std::copy:确保std::string完成深拷贝,避免内存共享引发的访问违规。 - 补充
ausgabe的定义:解决编译阶段的未定义变量错误。 - 保持复制逻辑清晰:仅复制
myArray中已有的5个元素到neuArray前5个位置,第6个位置保留默认空字符串。
内容的提问来源于stack exchange,提问作者El ayoub
相关产品推荐
相关产品推荐

