赋值不起作用,但使用取消引用运算符的地址可以吗?

Assignment doesn't work but address of with the dereference operator does?

我一直在研究 C++(刚开始),我正在尝试编写一个程序,该程序需要一个函数来计算 C++ 中的行数。但是,我遇到了正常分配不起作用的奇怪行为,但通过地址进行分配,然后立即取消引用。像这样:

int countLinesInFile(string fileName){
  char c[32];
  int numLines = 0;
  ifstream file(fileName);

  while(file >> c){
    numLines += 1;
    cout << "Lines: " << numLines << endl;
  }
  return numLines;
}

这导致:

Lines: 1
Lines: 1
Lines: 1
Lines: 1
Lines: 1
Lines: 1

然而,当我将 numLines += 1 更改为 *(&numLines) += 1 时,它神奇地起作用了:

Lines: 1
Lines: 2
Lines: 3
Lines: 4
Lines: 5
Lines: 6

关于一些背景知识,我正在阅读的文件是一个 6 行文件,其中每行都是一个 32 位二进制字符串(等于零)。当我打印出 c(使用 cout << c)时,它打印出来似乎正确。此外,我知道这可能不是从文件中读取行的最佳或正确方法,但除非这根本不可能工作,否则我更感兴趣的是为什么会发生这种行为的基本机制,以及我我做错了。

好吧,这就是答案。正如 StoryTeller 所说,数组的长度必须为 33 个字符,以便捕获终止字符并防止异常行为。

P.S。感谢您提供所有有用的评论,我同意 getline 可能是更好的选择。如果有人对这种溢出究竟是如何导致这种奇怪的行为有任何见解,那将是非常受欢迎的。

将class std::string与API std::getline一起使用,您可以在每次读取时读取整行并在每次读取计数器变量时递增:

std::string sLine;
std::ifstream in("main.cpp");
int nLines = 0;

while(std::getline(in, sLine))
    ++nLines;
std::cout << nLines << endl;

in.close();

'[=10=]'字符二进制值为00000000。我猜 numLines 就在内存中的数组 c 之后,并且在递增 1 之前总是用零擦除。所以它总是显示为 1.

当你编译第二个版本时,内存必须以另一种方式组织(只有编译器知道,如果你在非常低的级别调试,你就知道),这不会影响 numLines 值。