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

