[英]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.