为什么我的范围基于循环崩溃我的C++程序?

qua*_*els 2 c++ for-loop clang c++11

我正在尝试使用基于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用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.
Run Code Online (Sandbox Code Playgroud)

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

hello world
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

根据log.txt文件,程序进入for循环,但它永远不会进入for循环.我错过了什么?

tem*_*def 10

这个循环:

for(int i : sortMe) {
    log("in loop " + i);
    sortMe[i] = i + 1;
}
Run Code Online (Sandbox Code Playgroud)

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

如果要将每个元素设置为等于其位置,只需使用普通的for循环:

for (int i = 0; i < 10; i++) {
    sortMe[i] = i + 1;
}
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!


Jos*_*eld 5

您正在使用基于范围的for循环,您应该使用标准for循环.在int i你的循环是不是当前元素的索引,但该元素的值.也就是说,如果您的数组包含{1, 3, 3, 7}的值i在每次迭代会1,然后3,然后3,然后7.由于您的数组未初始化,您不知道它的值是什么,i并且您将获得未定义的行为.

如果您想在for循环中使用索引,请使用标准for循环:

for(int i = 0; i < 10; i++) {
    log("in loop " + std::to_string(i));
    sortMe[i] = i + 1;
}
Run Code Online (Sandbox Code Playgroud)

请注意,要进行字符串连接+,您的一个操作数将需要为a std::string.否则,您将添加i指向第一个字符的指针"in loop ".