我正在从 C# 迁移到 C++,并且遇到了一个似乎没有意义的范围问题。这是一些显示我的问题的示例代码。
int rounds = 0;
char *names[10];
while (rounds < 10)
{
char name[10];
if (rounds == 1)
std::strcpy(name, "Test");
std::cout << &name << " " << name << std::endl;
names[rounds] = name;
++rounds;
}
我不明白为什么我总是得到相同的地址,以及为什么变量在第二轮之后就已经设置了。
解释一下当我遇到这个问题时我在做什么。我试图用名称键和答案值制作一个无序 map 。我认为应该发生的是 char name[10] 应该在每次 while 循环时创建一个新变量。但相反,我得到了完全相同的字符串文字,第二轮将用第二个名称删除第一个名称。
我知道字符串文字已经过时了,这对于 C++ 字符串来说不是问题。我还通过使用类似的方法解决了这个问题:
char *name = new char[10];
但我真的很好奇为什么上述代码每次都以相同的数组地址结束。这是某种编译器优化,还是我对范围的理解错误?
编辑:我相信我已经完善了我真正想要的东西。对于我需要回答的问题,这个示例可能不是最好的。
我正在寻找的是创建指向循环期间创建的对象的指针列表(无论是数组还是其他)的正确方法。如果可能的话,我们将不胜感激 C 和 C++ 实现。
最佳答案
每次循环时,局部变量都可能会在堆栈上的相同内存地址处向上移动,并且由于您没有初始化它,因此它仍将包含之前存在的任何内容。
初始化它将证明这一点:
int rounds = 0;
char *names[10];
while (rounds < 10)
{
char name[10] = ""; //<--- this here
if (rounds == 1)
std::strcpy(name, "Test");
std::cout << &name << " " << name << std::endl;
names[rounds] = name;
++rounds;
}
关于c++ - C++ 中的 while 循环中始终存在变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41246867/