我编写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:已经有一段时间了。谢谢!
答案 0 :(得分:6)
这是罪魁祸首:
void populate(int* target, int n){
target = new int[n];
...
在这里,您将target
作为int*
传递,然后立即在本地重新分配到分配的内存,并且与传入的指针的耦合将丢失。因此,x
仍在main
内部进行了单元化,并且访问它是未定义的行为。将target
的类型更改为int*&
,它应该适合您。您也可以使用int**
并传递x的地址,但这需要对您的函数内的target
进行大量更改。