В моей программе на C я использую функцию void со следующими аргументами: один двумерный массив int, один указатель int, который будет использоваться для создания нового динамического массива, и последний указатель int, который будет содержать количество счетчиков, которые будут происходить внутри функция. Таким образом, динамический массив создается в функции с использованием malloc, и все работает нормально, пока я не напечатаю его элементы в main () после вызова функции. Я получаю ерунду вместо цифр, которые я должен видеть. Вот код функции:
void availableMoves(int array[][3], int *av, int *counter)
{
int i, j;
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
if (array[i][j] == E)
{
printf("%d ", 3*i + j + 1);
(*counter)++;
}
}
}
av = (int *) malloc(*counter * sizeof(int));
if (av == NULL)
{
printf("ERROR!");
}
else
{
for (i=0; i<*counter; i++)
*(av + i) = 0;
int pos = 0;
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
if (array[i][j] == E)
{
*(av + pos++) = 3*i + j + 1;
}
}
}
}
}
*counter
таким образом в случае ошибки. Используйте временнуюint tmp_count = *counter;
переменную и присвойте ее обратно*counter
, только если функция завершилась успешно. Или сделайте этоabort();
, если malloc не работает, или что-то в этом роде. Избегайте получения частичного результата (av=null
, но*counter
все еще изменен). - person hyde   schedule 02.01.2013*(av + pos++) = 3*i + j + 1;
то же самое, что иav[pos++] = 3*i + j + 1;
, но большинство читателей предпочитают вторую форму. Аналогично(*counter)++;
, которое можно было бы записать как*counter += 1;
, избегая скобок. - person wildplasser   schedule 02.01.2013