0

运行此代码时遇到分段错误(没有编译器警告或错误)。尝试将“测试”分配给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)) 我哪里错了?

4

6 回答 6

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 )
于 2013-06-13T14:10:51.763 回答
2
void setStruct(myStruct*& str)

以上可能是您想要的:更改传递的指针,作为输出参数。

于 2013-06-13T14:05:12.910 回答
0

You should use a reference to your pointer to modify it in your function:

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 );
}
于 2013-06-13T14:12:20.177 回答
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;
}
于 2013-06-13T14:06:00.203 回答
0

调用者很可能在堆栈上setStruct分配 a :myStruct

myStruct value;

你在打电话setStruct(&value);

这将导致分段错误,因为您将尝试重新排列堆栈内存。但是,如果没有完整的示例,很难说其他任何事情。

代码没有任何问题,因为它除了str = new myStruct();没有将后面的指针的值传递回调用者之外:调用者仍将引用指向未分配内存的指针,这将导致未定义的行为。但这不会导致您的崩溃,因为您说错误发生的位置。

一个简单的解决方法是将函数原型更改为

void setStruct(myStruct*& str)

即通过引用传递指针,以便调用者得到修改后的指针值。

于 2013-06-13T14:07:10.163 回答
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 的回答指出的指针。

于 2013-06-13T14:05:26.620 回答