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

これまでの私の理解では、このステートメントは次のように述べています。文字を保存できるメモリ位置のアドレスを教えてください。そのため、コンパイラは 1 バイトのメモリを割り当てます。次に、任意の数の文字を次のように格納できる理由:

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?
4

2 に答える 2

1

1 char* var = 新しい文字;

あなたの理解は正しいです。コードが他の場所に強制的に文字を挿入しようとしており、UB が呼び出されている (未定義の動作)

2 上記の回答された動作 ...

上記を参照

3 なぜ 1 つの cout が値を印刷し、他の印刷アドレスが表示されるのですか?

再びUB、最初に期待される出力を取得するのは不運です

于 2013-10-27T10:08:12.167 に答える
0

Since questions 1 and 2 are already answered by P0W, the answer to question 3 is that when you pass a pointer to a null terminated string to cout, it prints the string.

于 2013-10-27T12:58:17.587 に答える