【问题标题】:mysterious c++ segmentation fault神秘的 C++ 分段错误
【发布时间】:2013-09-09 05:02:01
【问题描述】:

我是 C++ 新手,在解决这个简单问题时遇到了一些困难。以下代码表现出一些奇怪的行为。我正在尝试将一堆数字打印到文本文件中并计算需要多长时间。对于较小的 n ( 10000,程序崩溃并出现错误“分段错误(核心转储)”。

这是我的完整代码:

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

using namespace std;

double listN(int n)
{
    clock_t start = clock();
    ofstream resultsfile;

    resultsfile.open("Number.txt");

    for (int i = 0; i < n; i++)
    {
    resultsfile << i + "\n";
    }

    resultsfile.close();

    return (1000 * (clock() - start)/(double) CLOCKS_PER_SEC);
} 


int main()
{
    const int NUM_RUNS = 20;
    double time = 0;
    int n;

    cout << "Enter the value n:";
    cin >> n;

    for (int i = 0; i < NUM_RUNS; i++)
    {
     time += listN(n);
    }

    cout << time / NUM_RUNS <<endl;
    return 0;
}

有人知道这个问题吗?

【问题讨论】:

    标签: c++ g++ segmentation-fault


    【解决方案1】:

    因为您想将整数和新行打印到文件中,而不是“添加”它们,所以这一行

    resultsfile << i + "\n";
    

    应该是

    resultsfile << i << "\n";
    

    下次,使用-g 选项编译您的程序并在gdb 中运行它。运行程序并收到 segfault 后,输入backtrace,这样你就可以看到你的代码在哪里出错了。这样分段错误就不会那么神秘了。

    【讨论】:

    • 魔术!工作完美。谢谢。你知道为什么它对小 n 和大 n 给出不同的行为吗?
    • 我认为您正在打印文件中的垃圾。但是,i 的值很小,i + "\n" 仍然指向内存中有权读取的位置。
    • 在互联网上搜索“存储字符串文字的位置”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2017-04-20
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多