Изучение указателя C ++ приводит к дампу ядра со следующим кодом, я действительно не знаю почему?

#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-проверяя —with-system-zlib —enable -__ cxa_atexit —disable-libunwind-исключения —enable-java-awt = gtk —host = x86_64-redhat-linux
Модель потока: posix
gcc версия 3.4.5 20051201 (Red Hat 3.4.5-2)

-5

Решение

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

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
1

Другие решения

Эта линия

*dp = array;

не делает то, что вы намерены. ‘dp’ — указатель на указатель, и его начальное значение равно нулю (NULL). Итак, вы пытаетесь указать системе поместить адрес массива в ячейку памяти 0, что недопустимо.
Для того, чтобы он заработал в первую очередь, вам нужно выделить номер типа int *

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

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

0

По вопросам рекламы [email protected]