нарушение доступа в 3-мерном массиве c ++ (использование malloc)

Я пытаюсь сделать массив целочисленных трехмерных, где я знаю, что количество столбцов равно 2.
Я инициализирую массив последовательно с помощью malloc. Подскажите пожалуйста что может быть не так?

int **output_vertex[2];
for(int j=0;j<4;j++)
output_vertex[j]= (int **)malloc(sizeof(int **));
output_vertex[1][0]==(int*)malloc(2*sizeof(int));
output_vertex[1][0][0] =11;
//also tried  *output_vertex[1][0] =11;

0

Решение

У меня возникли проблемы с пониманием вашей ошибки (или той, на которую вы ссылаетесь). Во-первых, я не знаю, почему вы статически создаете массив, а затем используете malloc. Во-вторых, я не понимаю, почему вы выполняете цикл for четыре раза (0, 1, 2, 3). Разве ваше распределение не должно быть примерно таким:

int **output_vertex;
output_vertex = (int **)malloc(2*(sizeof(int **)));
1

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

Объявление массива у вас не то, что вы хотели. У вас есть двухэлементный массив указателей на указатели на int. Эта страница хорошее руководство для чтения этих деклараций.

Лично я предпочитаю использовать typedefs и создавать сложный тип с нуля:

typedef int[2] element_type; // this is the 2-element array of ints
typedef element_type* inner_type; // this is the array of unknown size
typedef inner_type[5] outer_type; // this is the actual type we want to use

outer_type output_vertex; // we now have an array of 5 inner_type variables on the stack
// The output_vertex is *uninitialized* so we have to initialize each of its elements
for (int i=0; i < 5; ++i) {
output_vertex[i] = new inner_type[SOME_SIZE];
}
// do stuff with output_vertex now that it's initialized
// then, to prevent memory leaks, delete the memory you allocated
for (int i=0; i < 5; ++i) {
delete[] output_vertex[i];
}

Вероятно, есть способы упростить, но это должно быть началом.

Если вы хотите inner_type чтобы быть доступным, я бы сильно рекомендую использовать std::vector вместо сырых массивов. С необработанными массивами можно сделать гораздо больше бухгалтерии, поэтому я не буду приводить пример этого; Тем не менее, вот более или менее то, что вы будете делать с std::vector:

typedef std::pair<int,int> element_type; // this is the 2-element array of ints as a pair
typedef std::vector<element_type> inner_type; // dynamic vector this time

inner_type output_vertex[5]; // we now have an array of 5 inner_type variables on the stack
// do stuff with output_vertex

std::vector это так же быстро, как динамически распределяемый массив, но вам не нужно вести какую-либо бухгалтерию самостоятельно. У вас также есть то преимущество, что вам не нужно управлять таким количеством объектов, выделенных в куче.

Обратите внимание, что необработанные массивы не совместимы с контейнерами (например, std::vector), поэтому я использую std::pair здесь вместо

Если вы можете использовать C ++ 11 (или boost) и вам нужен массив фиксированного размера, превышающий два элемента, которые могут поместиться в стандартный контейнер, используйте std::array,

1

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