所以,鉴于以下内容:
#include <stdio.h>
int * getarr();
int main(int argc, char* argv)
{
int * arr = getarr();
printf("%d", sizeof(arr));
}
int* getarr()
{
static int a[4] = {0,1,0,3};
return a;
}
如何找到arr
的长度? arr[4] == 0
,但arr[0]
和arr[2]
也一样。
如果这是char*
,则答案为iterate until '\0'
,但这似乎不适用于'\0' == 0
。
寻址arr[5]
似乎始终导致值&gt; 16 3 - 1(我系统中int的大小),但这似乎不是一个可靠的衡量标准,因为它只会让我觉得只是内存中的一个空位。
有没有办法一致地检索这个值?或者它只是必须传递?
答案 0 :(得分:4)
当您在main()
函数中时,无法检索数组的长度。 int[4]
转换为int *
getarr()
后,此信息已丢失
答案 1 :(得分:3)
您必须自己跟踪阵列的大小。语言中没有任何内容可以帮助您。遗憾。
这是人们使用包含更强大数据结构的更高级别语言的原因之一,例如std::vector<T>
。
答案 2 :(得分:2)
除了用它明确地传递大小外,你找不到该数组的长度。
答案 3 :(得分:1)
C数组只是内存中的字节串...它们不像Pascal字符串或其他类似“数组”的数据结构,如Java,Python等具有运行时边界检查的语言,因此使用实际的数组数据来耦合有关数组大小的信息。因此,您将不得不传递数组的大小,以便知道它的大小,除非它是静态分配的,或者在本地堆栈帧上,此时您可以使用sizeof(array)
。
答案 4 :(得分:0)
在C.中无法知道.C数组只是指向内存的指针,因此它与底层指针类型具有相同的大小。
因此,您必须将长度存储在其他地方,例如在一个常数