C 我的阵列有多大?
因此,鉴于以下情况:C 我的阵列有多大?,c,arrays,C,Arrays,因此,鉴于以下情况: #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; } #包括 int*getarr(); int main(int argc,cha
#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;
}
#包括
int*getarr();
int main(int argc,char*argv)
{
int*arr=getarr();
printf(“%d”,sizeof(arr));
}
int*getarr()
{
静态int a[4]={0,1,0,3};
返回a;
}
如何计算arr
的长度arr[4]==0
,但是arr[0]
和arr[2]
也是如此
如果这是一个char*
,答案将是迭代到“\0”
,但这在这里似乎不起作用,因为“\0”==0
寻址arr[5]
似乎会始终导致值>163-1(我的系统中int的大小),但这似乎不是一个可靠的度量方法,因为我觉得它只是内存中的一个空位置
是否有方法一致地检索此值?或者它只是必须传入吗?在C中无法知道。C数组只是指向内存的指针,因此它的大小与底层指针类型相同
因此,必须将长度存储在其他位置,例如,在常量中,当使用
main()
函数时,无法检索数组的长度。当int[4]
转换为getarr()
返回的int*
时,此信息已丢失。除了显式传递数组的大小,您还无法找到该数组的长度。您必须自己跟踪数组的大小。语言中没有任何东西能为你做到这一点。对不起
这就是为什么人们使用包含更强大数据结构的高级语言的原因之一,例如
std::vector
C数组只是内存中的字节字符串。。。它们不像Pascal字符串或Java、Python等语言中具有运行时边界检查的其他“类似数组”的数据结构,因此会将有关数组大小的信息与实际数组数据进行耦合。因此,您必须传递数组的大小才能知道它有多大,除非它是静态分配的,或者在本地堆栈帧上分配的,此时您可以使用sizeof(array)
访问arr[4]
及以上是未定义的行为。@Mat,我也这么认为,但这似乎是相关的。就像:呃,数组不是指针,它们只是在很多上下文中衰减为指针。你是对的,数组不是指针。但是引用两者的标识符的类型是相同的,即声明为inta[5]
的a的类型是与int*b
相同的?如果它走路像鸭子,嘎嘎叫像鸭子,我就叫它鸭子。sizeof(int[30])!=sizeof(int*)
在我所知道的任何系统上。因此,类型不同。您可以创建一个指向数组(int(*)[30]
)的指针,它显然不同于指向指针(int**
)的指针-两者都可以被索引两次,但前者在索引时生成一个可以被索引的连续数据块,而后者生成一个指向其他地方可以被索引的连续数据的指针。