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

如何将std::string复制到char数组?拼接vector字符串时memcpy段错误如何解决

问题根因与修正代码

你的代码存在两个导致段错误的核心问题:

  • memcpy参数传递错误:data[position]是char类型的字符值,你将其强制转为指针相当于把字符ASCII值作为内存地址访问,属于非法内存访问。正确的目标地址应为data + position,即指向char数组从position下标开始的起始位置。
  • 内存分配长度计算错误:你用vector的元素个数作为总长度,只分配了2+1=3字节,但实际"Hello"+"World"总长度就有10字节,内存严重不足导致写入越界。你需要先累加所有字符串的长度再分配内存。

如果要得到预期的"Hello World"结果,还需要在两个字符串拼接时补充空格,以下是符合要求的修正后代码:

#include <iostream>
#include <vector>
#include <cstring>
#include <cstdint>
using namespace std;

// vector用const引用传递,避免不必要的拷贝
void concatenateString(const vector<string>& stringVector, char* data) {
    int position = 0;
    for (int i = 0; i < (int)stringVector.size(); i++) {
        // 修正memcpy目标地址,直接用string的size()避免重复调用strlen
        memcpy(data + position, stringVector[i].c_str(), stringVector[i].size());
        position += (int)stringVector[i].size();
        // 两个字符串之间加空格,最后一个元素后不加
        if (i != (int)stringVector.size() - 1) {
            data[position] = ' ';
            position += 1;
        }
    }
    data[position] = '\0'; 
}

int main() {
    vector<string> stringVector;
    stringVector.push_back("Hello");
    stringVector.push_back("World");

    // 计算所有字符串的总长度,加上空格的长度
    uint32_t dataLength = 0;
    for (const auto& str : stringVector) {
        dataLength += str.size();
    }
    dataLength += (uint32_t)stringVector.size() - 1;
    // 分配内存,额外+1存储空终止符
    char* data = (char*)calloc(dataLength + 1, sizeof(char));
    
    concatenateString(stringVector, data);

    cout << "RESULT: " << data << endl;

    if (data != NULL) free(data);

    cin.get();
    return 0;
}

内容的提问来源于stack exchange,提问作者Kim Trong Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:06:09