c++ - C++ 中的 while 循环中始终存在变量

标签 c++ c

我正在从 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/

相关文章:

c++ - 这段代码有什么问题?它在第二个 cin 可以执行之前终止

c - 声明外部类变量后的内存分配

机器编程时无法将 double 转换为 double *(高斯消除)项目

c - softwareserial.h 没有这样的文件或目录

python - 为什么我的缓冲区溢出漏洞只会打开用户 shell 而不是 root shell?

c++ - 编译 SDL 测试时出错

c++ - std::filebuf VS2015 错误

c++ - Qt:.pro 文件丢失?

c++ - HLSL 着色器显示有线颜色

c - 有没有一种简单的方法可以将带符号的 char 转换为没有符号扩展名的 int?