0

以下の特定のプログラムに関連するいくつかの疑問があります。どんな議論も内部を理解するのに役立ちます。

#include <iostream>
using namespace std;

int main() {
    // your code goes here

    char* ptr = new char[11];
    ptr = "helloworld";
    cout << ptr;

    int* ptr1 = new int[2];
    //ptr1 = {12, 24};
    cout << ptr1;

    return 0;
}
  1. cout << ptr; helloworld を出力します (値を出力します)。cout << ptr1 は、値ではなくアドレスを出力します。どうして??
  2. cout << ptr; 以来。値を出力します。新しい char[11] が ptr に割り当てるアドレスを取得する方法。
  3. If ptr = "helloworld"; 許可されています。なぜptr1 = {12、24}; 許可されていませんか?
4

2 に答える 2

6

あなたの質問の核心は、 << 演算子がある場合には文字列を出力し、別の場合にはアドレスを出力する理由です。これは、「真の」文字列型がなかった C 言語の遺産によるものです。c/c++ では、char* と char[] は一意に処理され、一般に「文字列」と見なされます。他の型の配列は、その型の配列であると見なされます。したがって、char* を出力する場合、<< は文字列出力が必要であると想定しますが、int[] を使用すると、配列の内容ではなくアドレスが出力されます。簡単に言うと、char[] と char* は、多くの出力関数で特殊なケースとして扱われます。

コンパイラがソースを処理する方法についても混乱していることがわかります。検討:

char* ptr = new char[11];
ptr = "helloworld";

このコードは、11 文字のメモリを割り当て、ptr をその割り当てのアドレスに設定します。次の行は、定数「helloworld」を作成して割り当て、初期化し、ptr をそのメモリのアドレスに設定します。11 個の初期化されていない文字を含むメモリ ロケーションと、"helloworld\0" に初期化されたメモリ ロケーションがあります。

于 2013-10-27T15:54:55.920 に答える
0

コードに重大な問題があり、それがメモリ リークです。メモリを割り当ててに割り当てますptrが、それを再割り当てして別の場所を指すようにします。メモリに文字列を含めたい場合は、割り当てられたメモリにコピーする必要があります。

また、宣言で配列を初期化する場合を除き、「リテラル配列」は言語で許可されていません。

于 2013-10-27T15:21:46.967 に答える