gpt4 book ai didi

c++ - 为什么基于范围的 for 循环会使我的 C++ 程序崩溃?

转载 作者:太空狗 更新时间:2023-10-29 23:23:22 25 4
gpt4 key购买 nike

我正在尝试使用基于 for 循环的新 C++11 范围。这是我的程序:

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>

using namespace std;

ofstream logger("log.txt");
void log(string message)
{
logger << message << std::endl;
logger.flush();
}

int main( int argc, char* args[] )
{
log("hello world");
cout << "hello world\n";

log("declare sort me");
int sortMe[10];

log("loop sortMe");
for(int i : sortMe) {
log("in loop " + i);
sortMe[i] = i + 1;
}
}

我正在使用 clang++ 进行编译。它编译时出现警告:

clang++ -o mycpp mycpp.cpp
mycpp.cpp:24:12: warning: range-based for loop is a C++11 extension
[-Wc++11-extensions]
for(int i : sortMe) {
^
1 warning generated.

当它运行时,我得到这个输出:

hello world
Segmentation fault (core dumped)

根据log.txt文件,程序进入了for循环,但是没有进入for循环。我错过了什么?

最佳答案

这个循环:

for(int i : sortMe) {
log("in loop " + i);
sortMe[i] = i + 1;
}

循环并返回存储在sortMe 数组中的,而不是sortMe 数组的索引。结果,查找 sortMe[i] 将跳转到数组的一个完全随机的索引(可能方式,方式超出范围),导致段错误。

如果你想设置每个元素等于它的位置,只需使用普通的 for 循环:

for (int i = 0; i < 10; i++) {
sortMe[i] = i + 1;
}

此外,正如@hmjd 指出的那样,对 log 的调用将无法正常工作,因为您正在对字符串进行指针运算,而不是进行字符串连接。

希望这对您有所帮助!

关于c++ - 为什么基于范围的 for 循环会使我的 C++ 程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14429338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com