2014-08-19 2 views
0

Я сталкиваюсь с нечетной ошибкой сегментации, которая происходит где-то, и мне было интересно, может ли это быть связано с тем, как я выделил матричный массив указателей.Выделение массива указателей

Он объявлен как таковы в файле .h:

int **matrix; 

Но когда я прохожу его, я использую его таким образом междунар * матрица [], чтобы доступ отдельных строки с матрицей [ i] (это значительно облегчило мои задачи).

Так что, когда я выделить матрицу, я должен был сделать:

matrix = new int * [vertices]; 
    for (int i = 0; i < vertices; i++) 
     matrix[i] = new int[vertices]; 

Или в третьей строке, следует использовать оператор ->:

matrix[i]-> new int[vertices]; // Or something like this. 

А что такое разница между ними?

+0

Можете ли вы разместить больше кода, как функция, которая получает матричный аргумент? И, возможно, опубликуйте небольшой, компилируемый пример. –

+3

Один компилируется, а другой нет? – 0x499602D2

+0

Файл огромен, это только его части, которые я волнуюсь, может быть причиной ошибки. @ 0x499602D2 хорошо, да, следовательно, комментарий рядом с ним ... – Ashley

ответ

0

Первый вариант, который вы предложили, в этом случае полностью прекрасен. Но второй с оператором -> даже не является допустимым синтаксисом. Первая строка из первого предложения на самом деле создает массив int* размера вершин:

matrix = new int * [vertices]; 

Каждый из элементов этого массива инициализируется с некоторыми значениями для мусора. Вы можете убедиться, что он инициализирован нулем, используя фигурные скобки, такие как: new int * [vertices](). Но в любом случае доступ к любому указателю на matrix[i]-> будет бессмысленным. Фактически оператор стрелки -> является оператором разыменования, который используется исключительно с указателями на объекты, у которых есть члены. Надеюсь, это поможет.

Смежные вопросы