C ++代码中的神秘分割错误

时间:2016-08-09 16:46:14

标签: c++ memory

我编写C ++已经有一段时间了,我对这段代码示例有一些问题:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

string* data;
int current = 0;

void init(){
    data = new string[6];
    data[0] = "7 4 3";
    data[1] = "8 11 12 16 17 18 20";
    data[2] = "17 16 20 2 20 5 13";
    data[3] = "17 8 8 16 12 15 13";
    data[4] = "12 4 16 4 15 7 6";
    data[5] = "8 14 2 11 17 12 8";
}

string getNext() {
    if(current == 0){
        init();
    }
    return data[current++];
}

void populate(int* target, int n){
    target = new int[n];
    string line = getNext();
    stringstream ss(line);
    for(int i=0; i<n; i++){
        ss >> target[i];
        cout << target[i] << endl;
    }
    // THIS WORKS FINE
    for(int i=0; i<n; i++){
        cout << "TARGET" << target[i] << endl;
    }
}

int main() {
    string line;
    int n, s, e;
    int* x, * a, * b, * c, *d;

    line = getNext();
    stringstream ss(line);
    ss >> n >> s >> e;
    cout << "N: " << n << " S: " << s << " E: " << e << endl;

    populate(x, n);

    // IMMEDIATE SEGMENTATION FAULT ON FIRST ITERATION
    for (int i = 0; i < n; i++) 
        cout << x[i] << endl;
    populate(a, n);
    populate(b, n);
    populate(c, n);
    populate(d, n);

    return 0;
}

在这个程序的最终形式中,它将需要用户输入,但是现在我正在用一个字符串数组模拟输入,我可以阅读,就像我从cin读取的那样。

我有几个整数数组指针,我将动态分配并用一行字符串输入填充每个。

我写了函数populate()来为我做这个,这样我就没有太多重复的代码了。

populate()似乎将数据正确加载到指定的指针中。我甚至可以在从函数返回之前将其打印出来。

但是,如果我尝试读取AFTER populate()返回后的指针,我会立即得到分段错误。知道为什么吗?一旦函数返回,引用是否会丢失?我是否必须以某种方式明确地将字符串块转换为int?我对此感到有些困惑。

GOT IT:已经有一段时间了。谢谢!

1 个答案:

答案 0 :(得分:6)

这是罪魁祸首:

void populate(int* target, int n){
    target = new int[n];
    ...

在这里,您将target作为int*传递,然后立即在本地重新分配到分配的内存,并且与传入的指针的耦合将丢失。因此,x仍在main内部进行了单元化,并且访问它是未定义的行为。将target的类型更改为int*&,它应该适合您。您也可以使用int**并传递x的地址,但这需要对您的函数内的target进行大量更改。