C++ 使用struct中的指针更改数据
我有一个名为sample的程序,它包含2个int成员和一个char*。当创建两个名为a和b的对象时,我尝试使用指针将一个新的动态字符串指定给a,然后将所有值复制到b。所以b=a。但稍后当尝试对a进行如下更改时:C++ 使用struct中的指针更改数据,c++,struct,C++,Struct,我有一个名为sample的程序,它包含2个int成员和一个char*。当创建两个名为a和b的对象时,我尝试使用指针将一个新的动态字符串指定给a,然后将所有值复制到b。所以b=a。但稍后当尝试对a进行如下更改时:a.ptr[1]=“X”b中的指针也会更改。我想知道为什么,以及如何解决这个问题 struct Sample{ int one; int two; char* sPtr = nullptr; }; int _tmain(int argc, _TCHAR* argv[
a.ptr[1]=“X”代码>b中的指针也会更改。我想知道为什么,以及如何解决这个问题
struct Sample{
int one;
int two;
char* sPtr = nullptr;
};
int _tmain(int argc, _TCHAR* argv[])
{
Sample a;
Sample b;
char *s = "Hello, World";
a.sPtr = new char[strlen(s) + 1];
strcpy_s(a.sPtr, strlen(s) + 1, s);
a.one = 1;
a.two = 2;
b.one = b.two = 9999;
b = a;
cout << "After assigning a to b:" << endl;
cout << "b=(" << b.one << "," << b.two << "," << b.sPtr << ")" << endl << endl;
a.sPtr[1] = 'X' ;
cout << "After changing sPtr[1] with 'x', b also changed value : " << endl;
cout << "a=(" << a.one << "," << a.two << "," << a.sPtr << ")" << endl;
cout << "b=(" << b.one << "," << b.two << "," << b.sPtr << ")" << endl;
cout << endl << "testing adresses for a and b: " << &a.sPtr << " & b is: " << &b.sPtr << endl;
return 0;
}
struct示例{
int-one;
int-2;
char*sPtr=nullptr;
};
int _tmain(int argc,_TCHAR*argv[]
{
样本a;
样本b;
char*s=“你好,世界”;
a、 sPtr=新字符[strlen(s)+1];
strcpy_s(a.sPtr,strlen(s)+1,s);
a、 1=1;
a、 二=2;
b、 1=b.2=9999;
b=a;
cout您的结构包含一个char*
。当您将a中的所有值赋给b时,指针也会被复制
这意味着a和b现在指向同一个字符数组。因此,更改此字符数组中的值会更改这两个结构的值
如果不希望出现这种情况,请为b创建一个新的字符数组,并使用strcpystrcpy
复制的是指针而不是值。要解决此问题,可以在结构中重写赋值运算符:
struct Sample{
int one;
int two;
char* sPtr = nullptr;
Sample& operator=(const Sample& inputSample)
{
one = inputSample.one;
two = inputSample.two;
sPtr = new char[strlen(inputSample.sPtr) + 1];
strcpy (sPtr, inputSample.sPtr);
return *this;
}
};
您可以发布运行此代码片段的输出吗?将b
分配给a
后,b
的所有成员的值都是a
中值的副本,包括指针(指针也是值,恰好可以解释为地址)因此a
和b
都有指向内存中相同位置的指针,而更改内存与a
或b
都没有关系,因为它们的所有指针都只指向该位置(相同)这有帮助吗?我可能更建议使用<代码> STD::String < /Cord>。而使用这种数组可能有一些原因,但这是人们在C++ C++对象模型中不应该尝试的低级编程。E片段既包含C又包含C++。OP不使用OO方法,因此不需要STD::string。我不能按照你的推理,@ 2501。即使你的程序不需要任何OOP,你仍然可以从使用更高级的数据类型中受益,比如“代码> STD::String 。