【问题标题】:C++ - Functions, Parameters & Pointers - Access ViolationC++ - 函数、参数和指针 - 访问冲突
【发布时间】:2015-11-06 12:42:37
【问题描述】:

我决定在以前的编程知识非常有限的情况下学习 C++。我目前正在关注Alex Alllain 所著的Jumping into C++ 一书。我已经阅读了关于指针的章节,作为练习题的一部分,我遇到了以下问题:

  1. 编写一个函数,提示用户输入他或她的名字和姓氏,作为两个单独的值。此函数应通过传递给函数的附加指针(或引用)参数将这两个值返回给调用者。尝试先使用指针,然后再使用引用。

这是我写的代码:

#include <iostream>

void getDetails(char * n, char * s)
{
    std::cout << "Input name: ";
    std::cin >> *n;

    std::cout << "\n";

    std::cout << "Input surname: ";
    std::cin >> *s;
}

int main()
{
    char *name = NULL;
    char *surname = NULL;

    getDetails(name, surname);

    std::cout << "Name: " << *name << "\n";
    std::cout << "Surname: " << *surname << "\n";

    return 0;
}

我一直遇到访问冲突错误,我完全不知道为什么。

  1. 我做错了什么?
  2. 为什么会出错?

【问题讨论】:

  • 仅通过这样的指针接收输入是危险的,因为用户输入的文本可能比您的空间多(在这种情况下实际上没有空间)。您应该使用让您检查输入量的方法,或者使用更简单、更安全的std::string

标签: c++ function pointers


【解决方案1】:

其实你有两个问题:

  1. 您没有为namesurname 保留内存(这就是您收到访问冲突错误的原因)
  2. 您正在读取来自 cin 的一个字符(因为您正在取消引用 char* 导致一个单一字符)

您可以通过使用std::string 而不是char* 来解决这两个问题

【讨论】:

    【解决方案2】:

    除了 MrMarleyThomas Sparber 的回答*,您可能会对 std::getline 函数感兴趣,因为 std::istream::operator&gt;&gt; 会在空格上中断,并且用户名可能包含一个。

    (*) 还不能评论。

    【讨论】:

    • 马利先生是指我吗?我见过很多人拼错我的姓氏,但这是最有趣的一个! :-) --> +1
    • 哎呀...我读的是原始海报的名字而不是你的名字:)
    【解决方案3】:

    您没有分配要存储姓名和姓氏的内存。 你的指针是空指针。

    char *name = NULL;
    char *surname = NULL;
    

    所以程序有未定义的行为。

    另外我认为作者的意思是使用std::string类型的对象

    在这种情况下,程序可能看起来像

    #include <iostream>
    #include <string>
    
    void getDetails( std::string *n, std::string *s )
    {
        std::cout << "Input name: ";
        std::cin >> *n;
    
        std::cout << "\n";
    
        std::cout << "Input surname: ";
        std::cin >> *s;
    }
    
    void getDetails( std::string &n, std::string &s )
    {
        std::cout << "Input name: ";
        std::cin >> n;
    
        std::cout << "\n";
    
        std::cout << "Input surname: ";
        std::cin >> s;
    }
    
    int main()
    {
        std::string name;
        std::string surname;
    
        getDetails( &name, &surname);
    
        std::cout << "Name: " << name << "\n";
        std::cout << "Surname: " << surname << "\n";
    
        std::cout << "\nAnd one more" << "\n";
    
        getDetails( name, surname);
    
        std::cout << "Name: " << name << "\n";
        std::cout << "Surname: " << surname << "\n";
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多