首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将文件写入字符串数组指针时出错(读取访问冲突)?CPP

将文件写入字符串数组指针时出错(读取访问冲突)?CPP
EN

Stack Overflow用户
提问于 2020-10-20 14:44:22
回答 1查看 150关注 0票数 0

对于一个问题,我必须使用动态分配和函数(仅使用指针变量)从.txt文件中读取名称,并按词法顺序对名称进行排序。但是,我甚至无法使读取函数正常工作。这就是它所写的:

代码语言:javascript
运行
复制
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];
    }
}

我主要是这样称呼它的:

代码语言:javascript
运行
复制
std::string* names;
names = new std::string[7];
readNames(&names);

但是,当我运行这个程序时,我会得到一个错误:

引发的异常:读取访问冲突。这是0×。

并显示此函数(不确定这是否有帮助):

代码语言:javascript
运行
复制
 void _Check_offset(const size_type _Off) const { // checks whether _Off is in the bounds of [0, size()]
        if (_Mysize < _Off) {
            _Xran();
        }
    }

如果有人能帮我这个忙,我会非常感激的,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 15:10:40

为了详细阐述乌兹克雷格的评论,让我们假设以下几点:

  • names驻留在堆栈上,所以我们给它分配在堆上的字符串的地址0x7f001000.
  • The数组,所以我们给它分配给names地址0x1000
  • ,所以地址0x7f001000包含值0x1000.

readNames内部,anames的地址,因此表达式*(a[i])可以重写为:

代码语言:javascript
运行
复制
*(*(&names + i))

对于i=0来说,这是可行的。基本上是取消引用a一次以获得数组的开始,然后再获得对第一个分配的std::string的引用。

对于任何其他i,都可以访问堆栈(0x7f001000 + i)上的数据,然后将该值作为指向std::string的指针取消引用。

通过编写(*a)[i],您可以得到以下计算:

代码语言:javascript
运行
复制
*(*(&names) + i) 

这就是

代码语言:javascript
运行
复制
*(names + i)

,或者

代码语言:javascript
运行
复制
names[i]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64447590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档