#include<iostream>
using namespace std;
int main()
{
char *a;
cin>>a;
cout<<a;/*when input is string it gives segmentation fault*/
char* b="hello";/*while this thing works fine*/
cout<<b;
}
两者之间有什么区别?
答案 0 :(得分:4)
除非明确初始化,否则局部变量不会以任何方式初始化,它们的值是 indeterminate (实际上看似随机)。这意味着您的指针a
很可能不会指向有效位置,因此当您使用它来获取输入时,程序将写入它不拥有的某个内存,从而导致undefined behavior(只是崩溃的最常见原因。)
当您定义变量b
时,您告诉编译器应该指向特定位置,指向由编译器创建并由程序拥有的字符数组。你初始化变量,所以使用它将工作fin。但请注意,字符串文字是被认为是只读的字符数组,所以要正确,你应该这样做。
const char* b = "hello";
答案 1 :(得分:2)
在第二个例子中,编译器分配的内存是字符串文字的特殊位置,在第一个例子中没有这样的空格......
由于cin
并未限制您输入的输入量,因此您不应使用它来填充裸char *
缓冲区,除非您确实将输入限制为较少比缓冲区
但你理论上可以做一些事情(我认为......如果流覆盖就像那样工作):
char *a = (char *)malloc(500);
cin >> setw(500) >> a;
答案 2 :(得分:1)
您需要在
中分配空间来存储字符cin >> a;
您将它们存储到无效位置,因为a
char
指针尚未指向有效内存,因此您需要指向一个有效的块
您可以通过new
运营商请求
a = new char[length];
cin >> a;
但你需要小心做
delete[] a;
使用完毕后,请注意不要写入超过length - 1
个字节。
将其声明为类似
的数组char a[100];
cin >> a;
将有效。
但你应该在c ++中避免这种情况,而是使用std::string
。
答案 3 :(得分:1)
char *a;// it is pointer which is memory was unallocated.
因此,使用此功能无法获得该值。你必须动态分配内存。
char *b="hello";
"hello"
将存储在只读存储器中。因此,cout
只需打印该内容。
答案 4 :(得分:0)
您已经声明了一个指针,但是您没有留出任何内存来存储字符串本身。在您的代码中,a
尚未初始化为指向任何有意义的位置。您需要将其设置为指向现有缓冲区:
char buf[SOME_SIZE];
char *a = buf;
或者您需要在运行时分配该内存:
char *a = new char[SOME_SIZE];
原因
char *b = "hello";
的作用是留出空间来存储字符串文字"hello"
,并将该字符串的地址分配给b
。请注意,尝试更新字符串文字的内容将调用未定义的行为(至少在C中,我有理由相信它在C ++中是正确的),因此您不希望编写类似
cin >> b;
只要b
指向文字。
答案 5 :(得分:0)
两种结构都是错误的。这首先是它指定的效果是错误的,但如果这是代码的唯一问题,编译器必须强制你并创建具有该ungood效果的可执行文件。第二个结构是错误的,因为它破坏了C ++语言的规则,因此符合标准的编译器不会接受它。
第一个构造:
char *a;
cin>>a;
使用未初始化的指针变量a
。这会导致未定义的行为,程序可能会崩溃,或者向Swizz总裁发送愤怒的电子邮件,或者做你认为会做的事情,无论如何。编译器有义务生成可执行文件,但可能会发出警告诊断信息。
第二个结构:
char* b="hello";
标准C ++中 无效。标准C ++不提供从字符串文字到char*
的转换。但是,有些编译器仍然会接受它,然后将b
初始化为指向字符串"hello"
中第一个字符的指针。
而不是处理原始指针等,你应该使用std::string
,如下所示:
#include <iostream>
#include <string>
using namespace std;
auto main() -> int
{
string a;
getline( cin, a );
cout << a << "\n";
string const b="hello";
cout << b << "\n";
}