Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用struct中的指针更改数据_C++_Struct - Fatal编程技术网

C++ 使用struct中的指针更改数据

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[

我有一个名为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[])
{
    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创建一个新的字符数组,并使用strcpy
strcpy
复制的是指针而不是值。要解决此问题,可以在结构中重写赋值运算符:

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 。