C++ - 函数、参数和指针 - 访问冲突
C++ - Functions, Parameters & Pointers - Access Violation
我决定学习C++,因为我以前的编程知识非常有限。我目前正在关注Alex Allain的《跳进C++》一书。我已经进入了关于指针的章节,作为练习问题的一部分,我遇到了以下问题:
- 编写一个函数,提示用户输入他的或她的名字和姓氏,作为两个单独的值。此函数应通过传递给函数的附加指针(或引用)参数将这两个值返回给调用方。试着先用指针,然后用引用来做这件事
这是我写的代码:
#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;
}
我一直遇到一个访问违规错误,我完全不知道为什么。
- 我做错了什么
- 为什么它错了
实际上您有两个问题:
- 您没有为
name
和surname
保留内存(这就是您收到访问冲突错误的原因) - 您只读取了
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;
}
相关文章:
- C++尝试深度复制唯一指针时出现内存访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 使用智能指针读取访问冲突
- C 指针转换会导致内存访问冲突
- C++:读取 Lambda 捕获的指针时出现访问冲突
- 初始化指针时出现写入访问冲突
- 不能对基于数组的指针使用数组运算符(读取访问冲突)
- C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD
- 调用指针时违反 C++ Typedef 访问冲突
- 为什么未初始化的指针会导致接近 0 的 mem 访问冲突
- 执行指针时发生C++访问冲突
- C++:使用std::ifstream读取二进制文件后删除缓冲区/指针时发生访问冲突
- 指针未指向 NULL 时的访问冲突
- 指针导致访问冲突
- 在标头中声明指针会导致访问冲突
- C++ - 函数、参数和指针 - 访问冲突
- Std::数组到指针访问冲突错误
- c++类:创建线程的对象+指向函数的指针=访问冲突
- C++指针访问冲突写入位置
- C++ shared_ptr<Base>指针访问冲突