5 回答

TA贡献1847条经验 获得超7个赞
答案是不。”
C程序员做的是在某处存储数组的大小。它可以是结构的一部分,或者程序员可以欺骗一点和malloc()更多的内存而不是请求,以便在数组开始之前存储长度值。

TA贡献1836条经验 获得超3个赞
对于动态数组(malloc或C ++ new),您需要存储其他人提到的数组大小,或者可能构建一个处理添加,删除,计数等的数组管理器结构。不幸的是,C不能做到这一点。 C ++,因为你基本上必须为你正在存储的每种不同的数组类型构建它,如果你需要管理多种类型的数组,这很麻烦。
对于静态数组,例如示例中的静态数组,有一个用于获取大小的公共宏,但不建议这样做,因为它不检查参数是否真的是静态数组。宏虽然在实际代码中使用,例如在Linux内核头文件中,尽管它可能与下面的稍有不同:
#if !defined(ARRAY_SIZE) #define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))#endifint main(){ int days[] = {1,2,3,4,5}; int *ptr = days; printf("%u\n", ARRAY_SIZE(days)); printf("%u\n", sizeof(ptr)); return 0;}
你可以google出于对这类宏的警惕。小心。
如果可能的话,C ++ stdlib如vector,它更安全,更易于使用。

TA贡献1859条经验 获得超6个赞
有一个使用C ++模板的干净解决方案,不使用sizeof()。以下getSize()函数返回任何静态数组的大小:
#include <cstddef>template<typename T, size_t SIZE>size_t getSize(T (&)[SIZE]) { return SIZE;}
这是一个foo_t结构的示例:
#include <cstddef>template<typename T, size_t SIZE>size_t getSize(T (&)[SIZE]) { return SIZE;}struct foo_t { int ball;};int main(){ foo_t foos3[] = {{1},{2},{3}}; foo_t foos5[] = {{1},{2},{3},{4},{5}}; printf("%u\n", getSize(foos3)); printf("%u\n", getSize(foos5)); return 0;}
输出:
3 5

TA贡献1788条经验 获得超4个赞
对于这个具体的例子,是的,如果你使用typedef(见下文)。当然,如果你这样做,你也可以使用SIZEOF_DAYS,因为你知道指针指向的是什么。
如果你有一个(void *)指针,就像malloc()等返回的那样,那么,不,没有办法确定指针所指向的数据结构,因此无法确定其大小。
#include <stdio.h>#define NUM_DAYS 5typedef int days_t[ NUM_DAYS ];#define SIZEOF_DAYS ( sizeof( days_t ) )int main() { days_t days; days_t *ptr = &days; printf( "SIZEOF_DAYS: %u\n", SIZEOF_DAYS ); printf( "sizeof(days): %u\n", sizeof(days) ); printf( "sizeof(*ptr): %u\n", sizeof(*ptr) ); printf( "sizeof(ptr): %u\n", sizeof(ptr) ); return 0;}
输出:
SIZEOF_DAYS: 20sizeof(days): 20sizeof(*ptr): 20sizeof(ptr): 4
- 5 回答
- 0 关注
- 1271 浏览
添加回答
举报