2013-10-24 83 views
-2

我正在C中工作,并且试图复制其他语言(即: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); 
    } 
}