我正在使用 C 语言,并试图复制length
其他语言(即:C++)用来确定数组长度或可能的数据向量的成员函数。这是我可以在 C 中完成的事情,还是我必须回到这样的例子:
int arraySize = sizeof(array) / sizeof(array[0]);
通常,在 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);
}
}