C++ - 函数、参数和指针 - 访问冲突

C++ - Functions, Parameters & Pointers - Access Violation

本文关键字:指针 访问冲突 函数 C++ 参数      更新时间:2023-10-16

我决定学习C++,因为我以前的编程知识非常有限。我目前正在关注Alex Allain的《跳进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. 为什么它错了

实际上您有两个问题:

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

只需使用std::string而不是char* 即可解决这两个问题

除了Marley先生Thomas Sparber的答案*之外,您可能会对std::getline函数感兴趣,因为std::istream::operator>>在一个空间上中断,并且用户名可能包含一个。

(*)还不能对此发表评论。

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

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