对于一个问题,我必须使用动态分配和函数(仅使用指针变量)从.txt文件中读取名称,并按词法顺序对名称进行排序。但是,我甚至无法使读取函数正常工作。这就是它所写的:
void readNames(std::string* a[])
{
std::ifstream fin;
fin.open("names.txt");
for (int i = 0; i < 7; ++i)
{
fin >> *(a[i]);
std::cout << *a[i];
}
}我主要是这样称呼它的:
std::string* names;
names = new std::string[7];
readNames(&names);但是,当我运行这个程序时,我会得到一个错误:
引发的异常:读取访问冲突。这是0×。
并显示此函数(不确定这是否有帮助):
void _Check_offset(const size_type _Off) const { // checks whether _Off is in the bounds of [0, size()]
if (_Mysize < _Off) {
_Xran();
}
}如果有人能帮我这个忙,我会非常感激的,谢谢!
发布于 2020-10-20 15:10:40
为了详细阐述乌兹克雷格的评论,让我们假设以下几点:
names驻留在堆栈上,所以我们给它分配在堆上的字符串的地址0x7f001000.names地址0x1000。
在readNames内部,a是names的地址,因此表达式*(a[i])可以重写为:
*(*(&names + i))对于i=0来说,这是可行的。基本上是取消引用a一次以获得数组的开始,然后再获得对第一个分配的std::string的引用。
对于任何其他i,都可以访问堆栈(0x7f001000 + i)上的数据,然后将该值作为指向std::string的指针取消引用。
通过编写(*a)[i],您可以得到以下计算:
*(*(&names) + i) 这就是
*(names + i),或者
names[i]https://stackoverflow.com/questions/64447590
复制相似问题