2013-10-24 3 views
-2

Я работаю в C и пытаюсь реплицировать функцию-член length, чтобы использовать другие языки (например: C++) для определения длины массива или, возможно, вектора данных. Это то, что я могу сделать в C, или я должен упасть обратно на примерах, как это:Длина 2D-массива [i]

int arraySize = sizeof(array)/sizeof(array[0]); 

ответ

2

В общем, в 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); 
    } 
} 
Смежные вопросы