对以下程序的一些说明

some clarification for the below program

本文关键字:说明 程序      更新时间:2023-10-16
#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 时,它会打印该字符串。