对以下程序的一些说明
some clarification for the below program
#include<iostream>
using namespace std;
char* function1()
{
char* var = new char;
var[0] = 'q';
var[1] = 'p';
return var;
}
int* function2()
{
int* var = new int;
var[0] = 12;
var[1] = 20;
return var;
}
int main() {
cout << function1() << endl;
cout << function2() << endl;
// your code goes here
return 0;
}
输出:
qp
0x9cf9018
该程序存在一些疑问。任何讨论都将非常有助于理解这些事情。
1. char* var = new char;
根据我到目前为止的理解,这句话说: 给我一个内存位置的地址,我可以在其中存储字符。 所以编译器将分配一个字节的内存。那么为什么我们能够将任意数量的字符存储为:
var[0] = 'q';
var[1] = 'p';
var[1] = 'r';
如果答案是因为连续的内存位置,我们可以访问下一个内存,那么我们是否没有访问没有提供给我们的东西。 并且还在不知不觉中覆盖了属于他人的东西。如果答案再次是肯定的,那么为什么编译器允许我们这样做。以及如何避免这件事。 另外,如果我们不避免这件事,我们可以在多次运行程序时获得一些意想不到的结果吗?
2. The answered behavior of above point is same for int* var = new int; and char* var = new char, or is different. And if is different, what is the difference?
3. why one cout is printing value, while other printing address?
1 个字符* 变量 = 新字符;
你的理解是正确的。代码强行尝试在其他位置插入字符,这会调用 UB(未定义的行为)
2 以上回答的行为...
见上文
3 为什么一个cout是印刷价值,而另一个印刷地址?
再次 UB,首先你不幸获得预期的输出
由于问题 1 和 2 已经由 P0W 回答,因此问题 3 的答案是,当您将指向以 null 结尾的字符串的指针传递给 cout 时,它会打印该字符串。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- C 程序结果说明
- 了解 ARM 程序集说明和 C/C++ 指针
- 在Ubuntu 14.04启动我的应用程序时,非法说明(核心转储)错误,如何查看转储
- 如何在C 中编写一个程序,以说明不知道它正在阅读的数据文本文件中包含多少行
- 如何在 Windows 异常处理程序中设置 MMX 寄存器以模拟不受支持的 3DNow! 说明
- 不同编译器版本的C++中的奇怪行为(字符串通过引用传递):参见简单的程序说明
- 需要说明简单的C 程序中的编译误差,以演示超载函数
- 寻求有关如何在VC2010 C程序中集成tesseract的说明
- 是否提供了在linux上交叉编译gtkmm(特别是v3)windows库/应用程序的说明
- 对以下程序的一些说明