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

C++:将char数组数据复制到结构体中char指针时触发段错误的问题求助

问题根源:未初始化的野指针导致段错误

你的段错误完全是因为结构体里的char* dataArr是一个未初始化的野指针——它没有指向任何一块属于你的程序的、可写的内存空间。当你调用strcpy(send1.dataArr, arr)时,函数会尝试把arr里的数据复制到send1.dataArr指向的随机地址,这个地址要么是受系统保护的只读内存,要么是不属于当前进程的内存,直接触发段错误。

先看你代码里的其他小问题(顺带优化)

  • char arr[temp.size()]; 是变长数组,这是C语言的特性,C标准并不支持(虽然GCC等编译器有扩展支持),如果要兼容标准C,建议直接用std::string或者动态分配内存。
  • 你创建的outStream没有写入任何内容,所以temp是空字符串,arr的大小是0,后续的复制操作其实没有实际数据,不过这不是段错误的核心原因。

解决方案:两种可行的修复方式

方式1:改用std::string(最推荐,无需手动管理内存)

把结构体里的char* dataArr替换成std::string,C++会自动帮你处理内存分配、复制和释放,完全避免野指针和内存泄漏问题:

#include <iostream>
#include <sstream>
#include <string>

// 假设Header和Footer是已定义的结构体
struct Header {};
struct Footer {};

struct Message {
    Header hdr;
    std::string dataArr; // 替换char*为std::string
    Footer ftr;
};

int main(){
    Message send1;
    std::ostringstream outStream;
    // 这里可以向流中写入实际数据,比如:
    outStream << "Hello, this is test data";
    std::string temp = outStream.str();
    
    // 直接赋值即可,无需strcpy
    send1.dataArr = temp;
    
    // 验证结果
    std::cout << "Struct data: " << send1.dataArr << "\n";
    return 0;
}

方式2:手动为char*分配内存(如果必须用C风格字符串)

如果你因为某些原因必须保留char*,那一定要先给它分配足够的内存,用完后记得释放:

#include <iostream>
#include <sstream>
#include <cstring>

struct Header {};
struct Footer {};

struct Message {
    Header hdr;
    char *dataArr;
    Footer ftr;
};

int main(){
    Message send1;
    std::ostringstream outStream;
    outStream << "Hello, this is test data";
    std::string temp = outStream.str();
    
    // 计算需要的内存大小:字符串长度 + 1(存储'\0'结束符)
    size_t dataSize = temp.size() + 1;
    // 动态分配内存
    send1.dataArr = new char[dataSize];
    // 复制数据
    strcpy(send1.dataArr, temp.c_str());
    
    // 验证结果
    std::cout << "Struct data: " << send1.dataArr << "\n";
    
    // 必须释放内存,避免泄漏
    delete[] send1.dataArr;
    return 0;
}

额外提醒:关于strncpy的误区

你之前尝试的strncpy也会触发段错误,原因和strcpy一样——目标指针没有有效内存。而且要注意:strncpy不会自动添加'\0'结束符,如果复制的长度等于源字符串长度,目标字符串会没有结束符,后续用它做字符串操作会出问题,所以用的时候一定要手动添加'\0',比如:

strncpy(send1.dataArr, arr, sz);
send1.dataArr[sz] = '\0'; // 手动添加结束符

但前提还是要先给send1.dataArr分配足够的内存。

内容的提问来源于stack exchange,提问作者Chip Brommer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:29:12