繁体   English   中英

尽管使用不同的值初始化,但元素数组最终都具有相同的值

[英]Array of elements all end up with the same value despite being initialized with different values

#include<cstring>
#include<iostream>
using namespace std ;
class CSR
{
private:
    char* csrName;
public:
    void setName(char* n)//a setter for name
    {
        csrName = n;
    }
    char* getName()//a getter for employee’s name
    {
        return csrName;
    }
};
int main()
{
    CSR employees[7];
    for(int i=0;i<7;i++)
    {
    char name[] = { 'E', 'M', 'P', char(i + 49), '\0' };
    employees[i].setName( name);
}
for(int i=0;i<7;i++)
    {
    cout<<employees[i].getName()<<endl; 
    }
}

/* 我没有得到所需的 output,它是 EMP1 EMP2 EMP3 EMP4 EMP5 EMP6 EMP7 当我运行这个程序时,我得到 EMP7 EMP7 EMP7 EMP7 EMP7 EMP7 EMP7 */

char name[] = { 'E', 'M', 'P', char(i + 49), '\0' };

该数组在第一个for循环内声明。 这意味着在每次循环迭代结束时,该数组都会被销毁。 一旦循环结束,并且i递增,这个数组就会被销毁。 这就是自动 scope 中声明的所有对象在 C++ 中的工作方式。

但是显示的代码在这些 arrays 被销毁之前在其他对象中保存了指向这些已销毁的 arrays 的指针。

仅仅因为您在另一个 object 中保存了指向该数组的指针,并不意味着引用的数组会自动复制到它自己的 memory 位置。 C++ 中的指针不是这样工作的。

for循环终止后,显示的代码然后尝试使用所有这些指针来销毁 arrays。

这是未定义的行为,也是您意外 output 的原因。

碰巧的是,由于您的特定 C++ 编译器的工作方式,在循环的每次迭代中创建和销毁的 arrays 中的每一个都以相同的 memory 地址结束,因此您看到相同的 output 每个时间。

您基本上在做的是将名称变量指向分配给参数 ie (n) 的 memory,但问题是每次 function 停止执行时 n 都会被销毁。

你应该做的是将你的名称变量指向一个新的 memory 位置并运行一个循环,以便它保持与参数相同的值而不是相同的 memory 位置。

像这样

  void setName(char* n)//a setter for name
    {
        csrName = new char [30]; // I just took the size as random, you can 
       change it.
      for (int i = 0; n[i - 1] != '\0'; i++)
      {
       csrName[i] = n[i];
      }
     }

暂无
暂无

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

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