C ++ - 函数,参数&指针 - 访问违规

时间:2015-11-06 12:42:37

标签: c++ function pointers

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

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

这是我写的代码:

#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. 为什么不对?

3 个答案:

答案 0 :(得分:8)

实际上你有两个问题:

  1. 您没有为namesurname保留内存(这就是您遇到访问冲突错误的原因)
  2. 您正在阅读cin中的一个字符(因为您要取消引用char*,这会产生一个字母字符)
  3. 您只需使用std::string代替char*

    即可解决这两个问题

答案 1 :(得分:2)

除了MrMarley Thomas Sparber的答案*之外,您可能会发现std::getline函数对std::istream::operator>>函数感兴趣,因为Generics在空格上打破并且用户优先名称可能包含一个。

(*)暂不予评论。

答案 2 :(得分:0)

您没有在存储名称和姓氏的位置分配内存。 你的指针是空指针。

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;
}