#c #arrays #pointers
#c #массивы #указатели
Вопрос:
Следующий код генерирует случайные числа между 1-9 для заполнения массива 3×3. Я могу генерировать числа, но когда я пытаюсь разыменовать указатель на массив и присвоить числа элементам в массиве 3×3, моя программа вылетает. Он компилируется и запускается, если я закомментирую строку, которая выполняет назначение. Может кто-нибудь объяснить ошибку?
void initSquare(MagSquare_PTR mptr, int magicsquaresize){
int i, j, k, m, randomNum, hasRepeat, numSquares, checkCount,whileCount;
numSquares = (magicsquaresize * magicsquaresize);
int check[numSquares][2];
for(m = 0; m < numSquares; m ){
check[m][0] = m;
check[m][1] = 0;
}
for( i = 0; i < magicsquaresize; i ){
for(j = 0; j < magicsquaresize; j ){
randomNum = ((rand()%numSquares) 1);
while(check[randomNum-1][1] == 1){
randomNum = ((rand()%numSquares) 1);
}
check[randomNum-1][1] = 1;
//*mptr[i][j] = randomNum;//THIS IS THE PROBLEM LINE
printf("%d", randomNum); //test
}
}
}
Комментарии:
1. вместо этого вы можете отслеживать появление в a
frequency array
, который изначально инициализируется0
, и если частота становится больше0
, тогда этот элемент не должен вставляться2. Попробуйте упростить свой код. Например, вам действительно не нужны два внешних
for
цикла, и тогда вам не нужна отдельнаяcheckCount
переменная.
Ответ №1:
если не объявлено статически, вы должны убедиться, что память была выделена для хранения значений вашего массива, на которые вы ссылаетесь с помощью mptr. Если вы выделяете память для своего массива, рекомендуется выделить с calloc
, чтобы инициализировать все значения массива 0
. Простая функция для инициализации 2-мерного массива, объявленного как int ** myarray, может использовать следующее:
float **array_calloc (int rows, int cols)
{
register int i;
float **array = xmalloc (rows * sizeof (*array));
for (i = 0; i < rows; i )
{
array [i] = xcalloc (cols, sizeof (**array));
}
return array;
}
В теле main() вы можете использовать функцию как:
int **myarray;
myarray = array_calloc (3, 3);
После инициализации вы можете заполнить свой массив следующим образом:
for (rows = 0; rows < 3; rows )
{
for (cols = 0; cols < 4; cols )
myarray [rows][cols] = yourvalue;
}
Ответ №2:
В вашем коде есть некоторые странные вещи…
k = numSquares;
Бьюсь об заклад, единственная цель этого — остановить цикл?
Использование:
break;
вместо этого. Это сделает ваш код более понятным.
Вам не нужно все время выполнять else . Вы можете просто сказать:
hasRepeat = 0;
сразу после входа в цикл while.
После выхода из цикла while у вас есть это:
checkCount ;
printf("%d", randomNum);
Какую строку кода вы ожидаете выполнить после этого printf? Бьюсь об заклад, это не так:
checkCount = 0;
Какова будет точка увеличения и сразу после этого будет установлено значение 0? Я думаю, вы имели в виду инициализировать его где-то в другом месте…
И последнее, но не менее важное: есть более простые способы получить такое поведение хэш-таблицы, которое вы имели в виду, как некоторые люди предлагали в комментариях