【发布时间】:2021-11-21 16:19:38
【问题描述】:
考虑以下简化代码:
typedef struct __attribute__ ((__packed__)) {
int numberB;
std::string strA;
} StructA;
typedef struct __attribute__ ((__packed__)) {
int numberB;
std::string strB;
} StructB;
char *ExampleClass::getBuffer(void){
char* mBuf;
int offset = 10;
return mBuf+offset;
}
void ExampleClass::ExampleFunction(StructA *A){
StructB *B = (StructB *)getBuffer();
B->numberB = A->numberA;
B->strB = A->strA;
return;
}
这里故意没有显示很多代码,但我相信我的问题的根源确实得到了证明:为什么我在尝试分配 B->strB = A->strA 时出现分段错误?
谢谢
【问题讨论】:
-
您正在取消引用一个未初始化的指针 (
B->numberB = ...)。 -
抱歉,在实际情况下,指针已初始化,我更新了示例以显示实际如何使用它。调试时正确分配 int 字段。字符串是导致段错误的原因
-
@DanielKlisiewicz 你不能跳过
string(或整个struct)的构造。 -
感谢@appleapple。在 getBuffer 函数中,我构造了一个 (char*),然后将其转换为 (B*)。这是不允许的吗?编译器似乎没有抱怨。听起来可能很傻,但是如果我从 (char*) 转换获得整个结构,我该如何构造字符串字段?
-
通过将 char* 强制转换为您的结构类型,您想要的在这里是不可行的。看起来您正在尝试进行(反)序列化(这是您应该搜索的关键字)。您这样做的方式可能适用于 POD 类型,但绝对不适用于
std::string之类的类型。
标签: c++ string pointers segmentation-fault