C++ C++;:通过指针访问struct的成员

C++ C++;:通过指针访问struct的成员,c++,pointers,C++,Pointers,我在运行此代码时遇到分段错误(没有编译器警告或错误)。 当尝试将“测试”分配给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 C

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

void setStruct(myStruct*& str)
以上内容可能就是您想要的:更改传递的指针作为输出参数

#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);
}
以上可能就是您想要的:更改传递的指针作为输出参数。

\include
#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);
}
结构myStruct { std::string-sString; 国际nNo; }; 无效设置结构(myStruct**str) { *str=新的myStruct(); (*str)->sString=“测试”; (*str)->nNo=4; } int main() { myStruct*p; setStruct&p; }
应该是您想要的,这是传递指针的C风格;由于您正在为传递的指针分配内存,因此单独传递指针不起作用,您应该传递指针的地址。另一种方法是引用Joop Eggen指出的指针。

#include
结构myStruct
{
std::string-sString;
国际nNo;
};
无效设置结构(myStruct**str)
{
*str=新的myStruct();
(*str)->sString=“测试”;
(*str)->nNo=4;
}
int main()
{
myStruct*p;
setStruct&p;
}

应该是您想要的,这是传递指针的C风格;由于您正在为传递的指针分配内存,因此单独传递指针不起作用,您应该传递指针的地址。另一种方法是引用Joop Eggen指出的指针。

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;
}

函数
setStruct
中的
str
是一个局部变量,其使用寿命在此函数中受到限制

因此,当
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;
}

setStruct
的调用方可能正在堆栈上分配
myStruct

您正在调用
setStruct(&value)

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

代码没有什么问题,因为它与以下事实无关:
str=newmystruct()后面的指针值
不会传回调用方:调用方仍将引用指向未分配内存的指针,这将导致未定义的行为。但这并不是导致崩溃的原因,因为你说错误发生在哪里

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

void setStruct(myStruct*& str)

i、 e.通过引用传递指针,以便调用者返回修改后的指针值。

很可能
setStruct
的调用者正在堆栈上分配
myStruct

void setStruct(myStruct *str)
{
   str->sString = "Test";
   str->nNo = 4;
}

int main()
{
    myStruct p;
    setStruct(&p);
    return 0;
}
您正在调用
setStruct(&value)

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

代码没有什么问题,因为它与以下事实无关:
str=newmystruct()后面的指针值
不会传回调用方:调用方仍将引用指向未分配内存的指针,这将导致未定义的行为。但这并不是导致崩溃的原因,因为你说错误发生在哪里

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

void setStruct(myStruct*& str)
i、 e.通过引用传递指针,以便调用者返回修改后的指针值

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 )
你可以这样做

编辑

int main()
{
   MyStruct *pDesc;
   MyClass myClassInstance( pDesc );
   std::cout<< pDesc->bar << std::endl;
   return 0;
}
应改为

MyClass::MyClass( MyStruct *& pDesc )

您应该在函数中使用对指针的引用来修改它:

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 );
}

您应该在函数中使用对指针的引用来修改它:

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 );
}

如果你正在传递一个已经有效的指针,为什么要为它分配内存?请提供真实的代码,这不是它。请提供一个完整的、可编译的和可执行的示例,显示你所描述的问题。请说明你的代码应该可以工作的
sStrnig
打字错误。正如其他人所说,它不会在方法之外产生任何影响,但这是另一个主题。@tzippy:是的,因此您需要将参数作为指向指针的指针,而不仅仅是指针。在深入研究之前,您需要更好地理解动态内存和指针语义。如果您正在传递一个已经有效的指针,为什么要为它分配内存?请提供真正的代码,这不是它。请提供完整的,可编译和可执行的示例,其中显示了您描述的问题。请注意,您的代码应该正确。正如其他人所说,它不会在方法之外产生任何影响,但这是另一个主题。@tzippy:是的,因此您需要将参数作为指向指针的指针,而不仅仅是指针。在深入研究之前,您需要更好地理解动态内存和指针语义。这很干净,意味着您不必担心释放内存。另外,您只发送指向类的指针,而不是整个结构。这很干净,意味着您不必担心释放内存。另外,您只发送指向类的指针,不是整个结构。