Сбой программы 2d динамического массива

0

Я написал динамически выделенный 2D-массив, и по какой-то причине он не работает, как я его намерен. Я выделил для массива 14x5 для хранения значений в.

Вот код:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int i, j, count, count2;
   int size, keysize, column;

   size = 7;  keysize = 10; column = 5;
   int row = (size * keysize) / column;  // 14

   char **arr = (char **)malloc(column * sizeof(char *));
   for(i=0; i<row; i++)
      arr[i] = (char *)malloc(row * sizeof(char *));

   count=0;
   count2=0;

   for(i=0; i<keysize; i++)
   {
      for(j=0; j<size; j++)
      {
         printf("arr[%d][%d]=", count2, count);
         arr[count2][count] = 'C';
         printf("%c\n", arr[count2][count]);
         count++;

         if(count == 5)
         { 
            count = 0;
            count2++;
         }
      }
   }
   return 0;
}

Кажется, что программа вылетает, когда значение должно быть вставлено в место arr [6] [0]. До этого он отлично работает. Я вставил некоторые заявления printf, чтобы зафиксировать это.

Я не уверен, почему это делается, распределение памяти выглядит хорошо со мной, но я не эксперт.

Спасибо за любую помощь.

  • 0
    примечание: пожалуйста, избегайте приведения возврата malloc()
  • 0
    arr[i] = (char *)malloc(row * sizeof(char *)); , Вы должны выделить (rows * elementsize) но не сразу понятно, сколько строк или какого размера у каждого элемента.
Показать ещё 3 комментария
Теги:
arrays
malloc

2 ответа

0

Я замечаю вопрос, отмеченный тегом c++, ясным способом сделать это в c++ является использование std::vector. Поэтому я отвечаю на это, как на вопрос C:

Похоже, вы не выделили достаточно места здесь.

column = 5;
char **arr = (char **)malloc(column * sizeof(char *));

Это делает пространство для 5 указателей для строк. Затем позже, когда вы зацикливаетесь:

for(i=0; i<keysize; i++)//note keysize is 10
{
    for(j=0; j<size; j++){ // note size is 7
        arr[count2][count];
        count++;
        if(count == 5){
            count = 0;
            count2++;//gets incremented every time the inner loop runs
        }
    }
}

Поскольку count2 получает приращение каждый раз, когда выполняется внутренний цикл, он в конечном итоге становится таким же большим, как и keysize. Это означает, что arr[keysize][0] должен быть действительным, а это не потому, что вы действительно сделали arr[5][14]. Первый сбой - это когда вы вызываете arr [6] [0], который обращается к концу массива и вызывает сбой вашей программы.

Если целью здесь является инициализация переменных, то для исправления вы, вероятно, захотите перебрать те же значения для измерений, которые вы использовали для выделения памяти.

0

изменить на

char **arr = (char **)malloc(row * sizeof(char *));
for(i=0; i<row; i++)
   arr[i] = (char *)malloc(column * sizeof(char));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню