-5
#include <stdlib.h>
int main(){
    int *array = new int[2];
    array[0] = 1;
    array[1] = 2;
    int ** dp = NULL;
    *dp = array;
    return 0;
}    

実行すると、セグメンテーション違反(コアダンプ)。g++ バージョンは

/usr/lib/gcc/x86_64-redhat-linux/3.4.5/specs から仕様を読み取る: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr で構成/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk - -host=x86_64-redhat-linux スレッド モデル: posix gcc バージョン 3.4.5 20051201 (Red Hat 3.4.5-2)

4

2 に答える 2

1

次のステートメントを変更します

int ** dp = new int *;

*dp = array;

または、上記の 2 つのステートメントの代わりに 1 つのステートメントを記述することもできます

int ** dp = new int *( array );

また、割り当てられたメモリを解放することを忘れないでください

delete dp;
delete []array;

コードに関しては、null ポインターを逆参照しようとしています。

<stdlib.h>C++ のC ヘッダーは のように命名されていることを考慮してください<cstdlib>。また、このヘッダーはプログラムでは使用されません。だから、それを取り除くことができます。

プログラムは次のようになります

#include <iostream>

int main() 
{
    int *array = new int[2] { 1, 2 };
    int ** dp = new int *( array );

    std::cout << ( *dp )[0] << '\t' << ( *dp )[1] << std::endl;

    delete dp;
    delete []array;

    return 0;
}

出力は

1   2
于 2014-11-09T15:03:32.000 に答える
0

この行

*dp = array;

あなたが意図したことをしません。dp はポインタへのポインタで、初期値はゼロ (NULL) です。したがって、「配列」のアドレスをメモリ位置 0 に配置するようにシステムに指示しようとしていますが、これは違法です。最初に機能させるには、いくつかの int * を割り当てる必要があります

dp = new int*[5];  // for example...
dp[0] = array;

これにより、最初のポインターが配列に割り当てられます

于 2014-11-09T15:03:30.343 に答える