При переходе с языков более высокого уровня я пытаюсь переустановить себя, изучая c. Я пытаюсь понять указатели и распределение памяти (о чем я никогда не думал раньше).На месте и обратно. Новые шаблоны дизайна в C
Код Пытаюсь
#include <stdio.h>
int main()
{
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 };
printf("\nShuffling...\n\n");
shuffle(array, sizeof(array)/sizeof(int));
int i;
for(i = 0; i < sizeof(array)/sizeof(int); i++)
{
printf("%d\n", array[i]);
}
}
int shuffle(int *shuffle_array, int length)
{
int i, j, newArray[length];
for(i = 0, j = length; i < length; j--, i++)
{
newArray[i] = shuffle_array[j];
}
shuffle_array = newArray;
}
Первый, это не работает, и я пытаюсь выяснить, почему массив не переворачивается на печать.
Второго, сравнивая концепцию редактирования на месте против возвращения нового пункта в с помощью malloc()
и free()
.
1st: newArray выделяется в стеке и будет освобожден после оставления shuffle -> shuffle_array укажет на мусор. Во-вторых, вы передаете указатель, а не ссылку на указатель (или указатель на указатель), поэтому ваш результат не будет возвращен на главную -> без изменений после тасования. – Till
классный, но тогда почему он печатает в оригинальном порядке правильно? если это указывает на мусор? – jondavidjohn
Поскольку вы используете C99 (иначе вам не будет разрешено объявлять переменную в основе функции), вы также должны объявить свои счетчики циклов таким образом: 'for (int i = 0, j = length; ...) '. Кроме того, 'shuffle' ничего не возвращает, хотя вы объявили его возвратом' int'. – Gandaro