繁体   English   中英

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

[英]C++: Access members of struct via a pointer

运行此代码时遇到段错误(无编译器警告或错误)。 尝试将“测试”分配给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)
{
   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 )
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);
}

应该是您想要的,这是传递指针的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的调用者很可能在堆栈上分配了myStruct

myStruct value;

并且您正在调用setStruct(&value);

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

该代码没有任何问题,因为它位于str = new myStruct();之后的指针值str = new myStruct(); 没有传递回调用者:调用者仍将指向指向未分配内存的指针,这将导致未定义的行为 但是自从给出错误发生的位置以来,这不会导致崩溃。

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

void setStruct(myStruct*& 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 );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM