В общем, в C, вы должны использовать массивы, так как они являются: непрерывный набор из нескольких кусков данных тот же тип. Обычно вы, как правило, отслеживаете размеры массивов, а также размер отдельных членов.
В C++, например, у вас есть доступ к классу Vector, который инкапсулирует и обрабатывает всю эту запись для вас.
В C вы должны были точно знать, насколько велика массив. Это особенно важно в случае распада указателя. Ваш первоначальный пример ...
int arrayOfInts[6] = {1, 2, 3, 4, 5, 6};
int sizeOfArray = sizeof(arrayOfInts)/sizeof(int); // Success; Returns "6"
Это работает в этом случае, но это не сработает, если вы должны были передать массив в функцию, ожидающий массив целых чисел (как указатель) в качестве аргумента функции.
#include <stdio.h>
int getArraySize(int* arr);
int main(void) {
int arrayOfInts[6] = {1, 2, 3, 4, 5, 6};
int sizeOfArray = getArraySize(arrayOfInts);
return 0;
}
int getArraySize(int* arr) {
int ret;
ret = sizeof(arr)/sizeof(int); // FAILS, returns the size of a pointer-to-int, not the size of the array
return ret;
}
Существует два способа справиться с этим: статические определения или тщательное управление динамической памятью.
// CASE 1: Trivial case, all arrays are of a static fixed size
#include <stdio.h>
#define ARR_SIZE (6)
int getArraySize(int* arr);
int main(void) {
int arrayOfInts[ARR_SIZE] = {1, 2, 3, 4, 5, 6};
int sizeOfArray = getArraySize(arrayOfInts);
return 0;
}
int getArraySize(int* arr) {
return ret ARR_SIZE;
}
// CASE 2: Managing sizes with dynamic allocation
#include <stdio.h>
#define ARR_SIZE (6)
int main(void) {
int sizeOfArray = ARR_SIZE;
int* arrayOfInts = malloc(sizeOfArray*sizeof(int));
if (arrayOfInts != NULL) {
// Success; initialize
int i;
for (i=0; i<sizeOfArray; i++) {
arrayOfInts[i] = i;
}
return 0;
} else {
// Failed; abort
sizeOfArray = 0;
return (-1);
}
}