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:是的,因此您需要将参数作为指向指针的指针,而不仅仅是指针。在深入研究之前,您需要更好地理解动态内存和指针语义。这很干净,意味着您不必担心释放内存。另外,您只发送指向类的指针,而不是整个结构。这很干净,意味着您不必担心释放内存。另外,您只发送指向类的指针,不是整个结构。