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

时间:2013-06-13 14:01:41

标签: 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 ClGadgetFs
{
    public:
            struct MyStruct{
        int bar;
        };
       MyClass(MyStruct *pDesc = NULL);
};

我想在调用new时我会为结构调整内存吗?像malloc(sizeof(myStruct))一样 我哪里错了?

6 个答案:

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