尝试读取和写入字符串时发生访问冲突?
Access violation when attempting to read and write a string?
我是 C++ 的新手。我来自 java 的土地,所以 input/output 系统让我有点困惑,如果这是一个愚蠢的问题,我很抱歉。
我正在尝试声明一个字符串,将一些控制台输入保存到它,然后打印该字符串。
int _tmain(int argc, _TCHAR* argv[])
{
char* pizza = "";
std::cin >> pizza;
std::cout << pizza;
return 0;
}
我收到一个访问冲突异常,这让我觉得我在某处有一个无效的内存地址。
你需要给数组一些space。喜欢:
char pizza[50];
这会起作用,但是这段代码可能会超出数组的边界(对于 C++ 标准,这只是未定义的行为)。正如其他张贴者指出的那样,使用 std::string
会更明智且易于使用。
您可以查看 this 教程以快速了解基本 C++ Input/Output。
我会解释你的代码有什么问题,但首先是正确的代码。
#include <string>
#include <iostream>
int main()
{
std::string pizza;
std::cin >> pizza;
std::cout << pizza;
return 0;
}
使用标准库字符串 class,而不是 char*
。现在开始你的代码。
char* pizza = "";
这是错误的。它以旧标准编译,但即使在那时它仍然是一个坏主意。字符串文字,如 ""
,是常量字符数组。使用上面的行,您将一个非常量指针分配给这个 const 字符数组。在涉及数组和指针的所有其他上下文中,这是非法的,因为它应该是。由于历史原因,允许(直到 C++11)用于字符串文字,但您仍然不应该这样做。因为即使你有一个非常量指针,写入它指向的位置仍然是非法的,这就是为什么你在尝试这样做时会遇到访问冲突:
std::cin >> pizza;
我是 C++ 的新手。我来自 java 的土地,所以 input/output 系统让我有点困惑,如果这是一个愚蠢的问题,我很抱歉。
我正在尝试声明一个字符串,将一些控制台输入保存到它,然后打印该字符串。
int _tmain(int argc, _TCHAR* argv[])
{
char* pizza = "";
std::cin >> pizza;
std::cout << pizza;
return 0;
}
我收到一个访问冲突异常,这让我觉得我在某处有一个无效的内存地址。
你需要给数组一些space。喜欢:
char pizza[50];
这会起作用,但是这段代码可能会超出数组的边界(对于 C++ 标准,这只是未定义的行为)。正如其他张贴者指出的那样,使用 std::string
会更明智且易于使用。
您可以查看 this 教程以快速了解基本 C++ Input/Output。
我会解释你的代码有什么问题,但首先是正确的代码。
#include <string>
#include <iostream>
int main()
{
std::string pizza;
std::cin >> pizza;
std::cout << pizza;
return 0;
}
使用标准库字符串 class,而不是 char*
。现在开始你的代码。
char* pizza = "";
这是错误的。它以旧标准编译,但即使在那时它仍然是一个坏主意。字符串文字,如 ""
,是常量字符数组。使用上面的行,您将一个非常量指针分配给这个 const 字符数组。在涉及数组和指针的所有其他上下文中,这是非法的,因为它应该是。由于历史原因,允许(直到 C++11)用于字符串文字,但您仍然不应该这样做。因为即使你有一个非常量指针,写入它指向的位置仍然是非法的,这就是为什么你在尝试这样做时会遇到访问冲突:
std::cin >> pizza;