指针数组只有在打印时才正确
Array of pointer correct only if printed?
函数用于将文本拆分为不同的(可能是平衡的)块(我在这里已经详细讨论过了)。下面是代码(查看下面的问题描述):
pair<off_t,off_t>* getSplits() {
struct stat st;
off_t size;
if (stat(file_name.c_str(), &st) == 0)
size = st.st_size;
int nMappers = size > nWorkers ? nWorkers : size; //if workers are greater than file size
pair<off_t,off_t> splits [nMappers];
double split_size = (double) size / nMappers;
off_t acc = 0 ;
ff::ParallelFor pf( ff_realNumCores() );
string prova = file_name;
pf.parallel_for(0,nMappers,[&splits,split_size, prova, size](const long i) {
ifstream ifs (prova , ifstream::in);
off_t begin = ceil((double) i*split_size);
off_t end = ceil((double) (i+1)*split_size-1);
char c;
string s;
if(begin>0){
//if char before the first one is different from ' ' or 'n'
//then the split begins in the middle of a word (bad)
ifs.seekg(begin-1,ios::beg);
ifs.get(c);
if(c!=' ' && c!='n'){
getline(ifs,s,' ');
begin+=s.length();
}
if(begin>end)
end=begin;
}
ifs.seekg(end,ios::beg);
ifs.get(c);
if(c!=' ' && c!='n' && end != size){
getline(ifs,s,' ');
end+=s.length();
}
splits[i] = {begin, end};
});
pair<off_t,off_t> *p = splits;
for(int i=0;i<nWorkers;i++){
cout<<"begin="<<p[i].first<<" end="<<splits[i].second<<endl;
}
return p;
}
这就是我称之为并打印其内容的方式
pair<off_t,off_t> *splits = input_format->getSplits();
for(int i=0; i<nWorkers; i++){
cout<<"outside split begin="<<splits[i].first<<" second="<<splits[i].second<<endl;
this->ff_send_out(new MapTask<MIK,MIV,MOK,MOV> (record_reader->clone(),splits[i],map_func));
}
问题是,如果我在getSplits()
(最后一个for
周期)内打印p
的内容,那么结果是正确的:
begin=0 end=13
begin=14 end=14
begin=15 end=21
begin=22 end=28
outside split begin=0 second=13
outside split begin=14 second=14
outside split begin=15 second=21
outside split begin=22 second=28
但是如果我没有(所以我删除了打印for
),那么结果是错误的(只有第一对是正确的)!
outside split begin=0 second=13
outside split begin=140152066182136 second=140152054622976
outside split begin=140152066227112 second=29521758
outside split begin=140152054622960 second=2564825869
这怎么可能?
您返回一个局部变量的地址,因此您有一个悬空指针。
我建议退回std::vector<std::pair<off_t, off_t>
。
您将获得一个指向堆栈的指针(函数定义的拆分位置)。
使用全局/静态变量,或者更好的方法是传递指针数组并将其填充到函数中。
相关文章:
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 在一定长度后从数组中打印时缺少整数
- 数组元素打印的递归方法
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 打印矢量数组中的所有元素
- 打印问题.我在数组中打印值时遇到一些问题
- 数组类 阵列的打印输出
- 动态分配的聊天数组打印缺失的数据和空
- 如何打印 2D 字符数组C++
- 如何修改代码以打印出数组 v2
- 在C++中初始化和打印 2D 数组
- 将浮点数转换为无符号字符数组并打印出来
- C++ 打印包含数据结构的数组
- 如何让字符数组在一行而不是多行中打印出来?
- 打印字符数组地址的正确方法
- 按字母顺序打印存储在字符数组中的信息
- 使用递归反转和打印出数组的内容
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 加载有空指针的字符数组的打印值