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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:22:15