Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我的阵列有多大?_C_Arrays - Fatal编程技术网

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**
)的指针-两者都可以被索引两次,但前者在索引时生成一个可以被索引的连续数据块,而后者生成一个指向其他地方可以被索引的连续数据的指针。