赋值不起作用,但使用取消引用运算符的地址可以吗?
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
值。
我一直在研究 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
值。