开发者社区> 问答> 正文

通过编程确定C ++数组的大小?

这个问题的灵感来自一个类似的问题:delete []如何“知道”操作数数组的大小?

我的问题略有不同: 是否可以通过编程方式确定C ++数组的大小?如果没有,为什么? 我见过的每个接受数组的函数也都需要一个整数参数来赋予它大小。但是正如链接的问题所指出的,delete[]必须知道要释放的内存大小。

考虑以下C ++代码:

int* arr = new int[256]; printf("Size of arr: %d\n", sizeof(arr)); 这将打印“ Size of arr: 4”,它只是指针的大小。拥有一些可以打印256的功能会很好,但是我认为C ++中不存在这样的功能。(再次,部分问题是为什么它不存在。)

澄清:我知道,如果我在堆栈而不是堆上声明了数组(即“ int arr[256];”),则sizeof运算符将返回1024(数组长度* sizeof(int))。 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 13:54:08 517 0
1 条回答
写回答
取消 提交回答
  • delete []不知道分配的大小。但是,该知识驻留在运行时或操作系统的内存管理器中,这意味着编译器在编译期间不可用。而sizeof()不是一个真正的功能,它实际上是评价由编译器的常数,这是一件好事它不能用于动态分配数组,其大小在编译期间是不知道做。

    另外,请考虑以下示例:

    int *arr = new int[256]; int *p = &arr[100]; printf("Size: %d\n", sizeof(p)); 编译器将如何知道其大小p?问题的根源在于C和C ++中的数组不是一流的对象。它们会衰减为指针,编译器或程序本身无法知道指针是否指向分配的内存块的开头new,或单个对象或块中间的某个位置。由分配的内存new。

    原因之一是C和C ++将内存管理留给了程序员和操作系统,这也是为什么它们没有垃圾回收的原因。实施new和delete不是C ++标准的一部分,因为C ++,就是要在各种不同的平台,它可以以非常不同的方式管理他们的记忆中。如果您正在为运行在最新Intel CPU上的Windows框编写文字处理器,则可以让C ++跟踪所有分配的数组及其大小,但是当编写在Windows XP上运行的嵌入式系统时,这可能是完全不可行的。 DSP。

    2020-02-10 16:04:57
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载