为什么在将字符串指针分配给字符串指针时会出现段错误?
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->numberB
和 B->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();
}
考虑以下简化代码:
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->numberB
和 B->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();
}