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

, когда я запускаю его, ошибка сегментации (ядро сбрасывается). г ++ версииУчение C++ указатель запускается в базовый дамп со следующим кодом, я действительно не понимаю почему?

Чтение данные из /usr/lib/gcc/x86_64-redhat-linux/3.4.5/specs Настроенные с: ../configure prefix =/USR --mandir =/USR/доли/man --infodir =/usr/share/info --enable-shared --enable-threads = posix --disable-check --with-system-zlib --enable -__ cxa_atexit --disable-libunwind-exceptions - включить-ява-АВТ = GTK --host = x86_64-RedHat-Linux модель тема: POSIX GCC версии 3.4.5 20051201 (Red Hat 3.4.5-2)

+3

Разыменование пустой указатель неопределенное поведение. –

+0

Надеюсь, вы только попробуете указатели, чтобы понять их. В вашем примере кода ни один из используемых указателей не требуется. Вы должны использовать локальные переменные вместо динамически выделенных. Пожалуйста, прочитайте и попытайтесь понять: https://stackoverflow.com/questions/22146094/why-should-i-use-a-pointer-rather-than-the-object-itself – Baiz

ответ

1

Изменить следующие утверждения

int ** dp = new int *; 

*dp = array; 

Или даже вы могли бы напишите одно заявление вместо двух выше

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

И не забудьте освободить выделенную память

delete dp; 
delete []array; 

Как для вашего кода, то вы пытаетесь разыменования нулевого указателя.

Учтите, что заголовок C <stdlib.h> в 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 
+0

большое спасибо :) – imotai

0

Эта линия

*dp = array; 

не делает то, что вы намерены. 'dp' является указателем на указатель, а его начальное значение равно нулю (NULL). Таким образом, вы пытаетесь сообщить системе разместить адрес «массив» в ячейке памяти 0, которая является незаконной. Чтобы сделать его работу сначала нужно выделить ряд междунар *

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

Это присвоит первый указатель на свой массив