如何将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
相关产品推荐
相关产品推荐

