对以下计划的一些澄清

时间:2013-10-27 10:02:36

标签: c++ pointers char int

#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';

如果答案是由于连续的内存位置,我们可以访问下一个内存,那么我们不会访问未提供给我们的内容。并且还在不知不觉中覆盖了属于他人的东西。如果回答是YES,那么为什么编译器允许我们这样做。以及如何避免这件事。另外,如果我们不回避这个问题,我们可以在程序的多次运行中得到一些意想不到的结果吗?

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?

2 个答案:

答案 0 :(得分:1)

  

1 char * var = new char;

您的理解是正确的。代码强行尝试在其他位置插入字符,调用UB(未定义的行为

  

2上面回答的行为......

见上文

  

3为什么一个cout是打印值,而其他打印地址?

再次UB,首先你运气不好获得预期的输出

答案 1 :(得分:0)

由于问题1和2已经由P0W回答,问题3的答案是当你将指向空终止字符串的指针传递给cout时,它会打印字符串。