运行此代码时遇到分段错误(没有编译器警告或错误)。
尝试将“测试”分配给str->sString
MyClass.cpp
//Constructor
MyClass::MyClass( MyStruct *pDesc )
{
pDesc = new MyStruct();
//This is where I get a segmentation fault
pDesc->bar= 0xFF;
}
MyClass.hpp
class ClGadgetFs
{
public:
struct MyStruct{
int bar;
};
MyClass(MyStruct *pDesc = NULL);
};
我想在调用new时我会为结构调整内存吗?像malloc(sizeof(myStruct))
一样
我哪里错了?
答案 0 :(得分:4)
void setStruct(myStruct *str)
{
str->sString = "Test";
str->nNo = 4;
}
int main()
{
myStruct p;
setStruct(&p);
return 0;
}
你可以这样做
修改强>
int main()
{
MyStruct *pDesc;
MyClass myClassInstance( pDesc );
std::cout<< pDesc->bar << std::endl;
return 0;
}
和
MyClass::MyClass( MyStruct *pDesc )
应改为
MyClass::MyClass( MyStruct *& pDesc )
答案 1 :(得分:2)
void setStruct(myStruct*& str)
以上可能就是你想要的:改变传递的指针,作为输出参数。
答案 2 :(得分:0)
#include <string>
struct myStruct
{
std::string sString;
int nNo;
};
void setStruct(myStruct **str)
{
*str = new myStruct();
(*str)->sString = "Test";
(*str)->nNo = 4;
}
int main()
{
myStruct *p;
setStruct(&p);
}
应该是你想要的,这是传递指针的C风格;因为你为传递的指针分配内存,所以单独传递指针不起作用,你应该传递指针的地址。另一种方法是引用Joop Eggen的answer指出的指针。
答案 3 :(得分:0)
str
中的 setStruct
是一个局部变量,其寿命在此函数中有限。
因此当new
返回地址时,对实际参数没有影响。
void func(int a){
a = 4
}
您应该使用指向指针或引用的指针
void setStruct(myStruct ** str){
(*str) = new myStruct();
(*str)->sString = "Test";
(*str)->nNo = 4;
}
void setStruct(myStruct *& str){
str = new myStruct();
str->sString = "Test";
str->nNo = 4;
}
答案 4 :(得分:0)
setStruct
的来电者可能在堆栈上分配myStruct
:
myStruct value;
您正在致电setStruct(&value);
这会导致分段错误,因为您将尝试重新排列堆栈内存。 如果没有完整的例子,很难说其他任何事情。
代码没有任何问题,因为它不会将str = new myStruct();
后面的指针的值传递回调用者这一事实:调用者仍然会指向指向未分配内存的指针。会导致未定义的行为。但那是不导致你的崩溃,因为你说错误发生的地方。
一个简单的解决方法是将函数原型更改为
void setStruct(myStruct*& str)
即。通过引用传递指针,以便调用者返回修改后的指针值。
答案 5 :(得分:0)
您应该使用对指针的引用来在函数中修改它:
struct myStruct{
std::string sStrnig;
int nNo;
};
void setStruct(myStruct* &str){
str = new myStruct();
str->sString = "Test";
str->nNo = 4;
}
main(){
struct myStruct *str = 0;
setStruct( str );
}