[英]after delete endl in cout << “hello” << endl, my C++ program stopped working
这是我的代码。 此代码可以很好地运行。 但是在删除“ cout <<” Hello world!“ << endl;”中的“ endl”时,它无法运行。 这是删除endl时得到的
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char * name;
char * n = "aaaa";
strcpy(name, n);
cout << name;
cout << "Hello world!" << endl;
return 0;
}
以下是删除endl的代码。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char * name;
char * n = "aaaa";
strcpy(name, n);
cout << name;
cout << "Hello world!";
return 0;
}
让我们看一下这些行:
char * name;
char * n = "aaaa";
strcpy(name, n);
变量name
未初始化。 它的内容是不确定的 ,似乎是随机的。 将其用作strcpy
调用的目标将导致未定义的行为 。
如果要使用C样式的字符串,则需要为name
分配内存,例如,使用数组:
char name[128];
但是,如果您实际上是用C ++进行编程,那么为什么不使用标准库随附的超棒类呢? 例如, std::string
类非常擅长处理字符串:
#include <string>
#include <iostream>
int main()
{
std::string name;
std::string n = "aaaa";
name = n;
std::cout << name << '\n';
std::cout << "Hello world" << std::endl;
}
name
是一个未初始化的指针:它指向某个随机存储器位置。 当你strcpy
它,你践踏五个字节在该位置,与替换它们aaaa\\0
。
形式上,这是不确定的行为。 在实践中,您目睹了两种不同的症状:没有明显的效果和崩溃。
将name
指向您实际拥有的足够大的缓冲区,一切都会好的。
char * name;
此行“名称”未初始化,并且保留垃圾。
而是执行以下操作:
using namespace std;
int main(){
char name[10];
char *n = "aaaa";
strcpy(name, n);
cout << name;
cout << "Hello world!";
return 0;
}
您正在复制到垃圾地址。
char * name; //<<<garbage address
char * n = "aaaa";
strcpy(name, n);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.