Это может быть сделано с помощью указателя и выделения памяти в куче с помощью malloc
.Обратите внимание, что позже невозможно спросить, насколько велик этот блок памяти.Вы должны сами следить за размером массива.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv)
{
/* declare a pointer do an integer */
int *data;
/* we also have to keep track of how big our array is - I use 50 as an example*/
const int datacount = 50;
data = malloc(sizeof(int) * datacount); /* allocate memory for 50 int's */
if (!data) { /* If data == 0 after the call to malloc, allocation failed for some reason */
perror("Error allocating memory");
abort();
}
/* at this point, we know that data points to a valid block of memory.
Remember, however, that this memory is not initialized in any way -- it contains garbage.
Let's start by clearing it. */
memset(data, 0, sizeof(int)*datacount);
/* now our array contains all zeroes. */
data[0] = 1;
data[2] = 15;
data[49] = 66; /* the last element in our array, since we start counting from 0 */
/* Loop through the array, printing out the values (mostly zeroes, but even so) */
for(int i = 0; i < datacount; ++i) {
printf("Element %d: %d\n", i, data[i]);
}
}
Вот и все.Ниже приведено более подробное объяснение того, почему это работает:)
Я не знаю, насколько хорошо вы знаете указатели C, но доступ к массиву в C (например, array[2]
) на самом деле является сокращением для доступа к памяти черезуказательЧтобы получить доступ к памяти, на которую указывает data
, вы пишете *data
.Это называется разыменованием указателя.Поскольку data
имеет тип int *
, то *data
имеет тип int
.Теперь важная информация: (data + 2)
означает «добавьте размер байта в 2 дюйма к адресу, на который указывает data
».
Массив в C - это просто последовательность значений в соседней памяти,array[1]
находится рядом с array[0]
.Поэтому, когда мы выделяем большой блок памяти и хотим использовать его в качестве массива, нам нужен простой способ получить прямой адрес для каждого элемента внутри.К счастью, C позволяет нам использовать обозначения массива и для указателей.data[0]
означает то же самое, что и *(data+0)
, а именно «доступ к памяти, на которую указывает data
».data[2]
означает *(data+2)
и обращается к третьему int
в блоке памяти.