Я написал динамически выделенный 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, чтобы зафиксировать это.
Я не уверен, почему это делается, распределение памяти выглядит хорошо со мной, но я не эксперт.
Спасибо за любую помощь.
Я замечаю вопрос, отмеченный тегом 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], который обращается к концу массива и вызывает сбой вашей программы.
Если целью здесь является инициализация переменных, то для исправления вы, вероятно, захотите перебрать те же значения для измерений, которые вы использовали для выделения памяти.
изменить на
char **arr = (char **)malloc(row * sizeof(char *));
for(i=0; i<row; i++)
arr[i] = (char *)malloc(column * sizeof(char));
malloc()
arr[i] = (char *)malloc(row * sizeof(char *));
, Вы должны выделить(rows * elementsize)
но не сразу понятно, сколько строк или какого размера у каждого элемента.