为什么在将字符串指针分配给字符串指针时会出现段错误?

Why do I get a seg fault when assigning a string pointer to a string pointer?

考虑以下简化代码:

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 时遇到分段错误?

谢谢

getBuffer()中,mBuf未初始化的,但是你给它加上offset,所以指针是return 'ed 不确定。它当然没有指向有效的 StructB 对象,这就是为什么 ExampleFunction() 中的后续代码在访问 B 的成员时崩溃的原因。从技术上讲,这是 未定义的行为,因此 任何事情 都可能发生,不保证会发生崩溃。

但是,即使 mBuf 被初始化为一个有效的 char[] 缓冲区,其大小足以容纳一个 StructB 对象,实际上仍然没有 StructB 对象被构造在此代码中,因此 B->numberBB->strA 不是有效对象。

getBuffer() 需要做更多像这样的事情:

char* ExampleClass::getBuffer(){
    char* mBuf = ...; // point to some char[] buffer that is at
                      // least 10+sizeof(StructB) in size, and
                      // isn't deallocated when getBuffer exits...
    int offset = 10;
    new(mBuf+offset) StructB;
    return mBuf+offset;
}

void ExampleClass::ExampleFunction(StructA *A){
    StructB *B = (StructB *)getBuffer();
    B->numberB = A->numberA;
    B->strB = A->strA;
    B->~StructB();
}

否则,ExampleFunction() 需要改为这样做:

char* ExampleClass::getBuffer(){
    char* mBuf = ...; // point to some char[] buffer that is at
                      // least 10+sizeof(StructB) in size, and
                      // isn't deallocated when getBuffer exits...
    int offset = 10;
    return mBuf+offset;
}

void ExampleClass::ExampleFunction(StructA *A){
    StructB *B = new(getBuffer()) StructB;
    B->numberB = A->numberA;
    B->strB = A->strA;
    B->~StructB();
}