Есть два способа инициализации массивов в C:
- На стек (который будет обрабатывать память для вас, так как он будет очищен, когда ваша функция заканчивается)
- В куче (что потребует от вас управления и выделения самостоятельно).
Если вы хотели бы использовать стек, вы можете инициализировать массив как это ...
#define ARRAY_LENGTH 10
void *ptr;
void *arr[ARRAY_LENGTH];
for (int i = 0; i < ARRAY_LENGTH; i++) {
arr[i] = ptr;
}
Аналогичным образом можно определить ваш массив в куче, как следует ...
#define ARRAY_LENGTH 10
void *ptr;
void **arr = malloc(sizeof(void *) * ARRAY_LENGTH);
for (int i = 0; i < ARRAY_LENGTH; i++) {
arr[i] = ptr;
}
free(arr);
Важно помнить, что массив (помимо массивов, назначенных в стеке, которые имеют некоторые дополнительные атрибуты, такие как длина), по существу, является просто указателем на первый элемент, а операция arr [i] - это то же самое, что перемещение i * sizeof (elem) байт вдали от первого элемента и доступ к памяти там. Если вы хотели бы получить указатель на я го индекса в массиве, то вы должны использовать обозначение, такие как ...
void *indexPtr = arr + i;
или
void *indexPtr = &(arr[i]);
В этой моде, массив от void * 's будет иметь тип void **, так как переменная является указателем на первый элемент массива, который является указателем.Это может быть немного запутанным, но всегда старайтесь иметь в виду, какой тип элементов массива, и создавать указатель на них. Таким образом, если массив имеет тип INT, то массив будет иметь тип INT или ИНТ [], но если вы хранения указателей на целые числа, вы бы инициализировать массив типа Int * в любом из этих двух форм ...
int **arr = malloc(sizeof(int *) * ARRAY_LENGTH);
int *arr[ARRAY_LENGTH];
Также обратите внимание, что вы храните указатели, так что если вы запустите код ...
int *arr[4];
for (int i = 0; i < ARRAY_LENGTH; i++) {
arr[i] = &i;
}
Хотя это может показаться, что значения указали в массив будет таким, как lows- [0, 1, 2, 3], но на самом деле это было бы [4, 4, 4, 4], поскольку у вас на самом деле есть массив указателей, указывающих на переменную i в вашей функции, поэтому всякий раз, когда вы меняете это, значения, указанные в массиве, будут изменены.
Я надеюсь, что это помогло
Почему вы используете 'void *' для 'void *'? [Вы никогда не должны бросать его в любом случае.] (Http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – 2013-04-20 19:08:18
'* (arr + i)' разыменовывание указателей void. – BLUEPIXY