c - C语言:C语言中数组的大小究竟是如何计算的
问题描述
内存地址指定了它们在内存中指向的数据字节数,因此似乎任何变量的大小都是通过查看内存地址并查看变量在内存中占用多少来确定的。那么数组的大小是怎么确定的???- 因为默认情况下,数组是指向数组中第一项的指针:
int main() {
int a[] = {1,2,3,4,5};
// both show same memory address
printf("%p\n", a);
printf("%p\n", &a[0]);
// somehow the entire size of a is calculated
printf("%lu\n", sizeof(a)); // 20 (all elements)
return 0;
}
解决方案
当你写
int a[] = {1,2,3,4,5};
编译器已经知道“a”里面只有 5 个整数。
你打电话时
sizeof(a)
您的编译器(不是您的程序)将计算 a 的大小。这基本上在您的程序中设置了数字“20”。每次你的程序运行时,它都会输出数字 20,它不会使用 sizeof。这不是在运行时评估的,而是在编译时评估的,因为在您的情况下 sizeof 是一个编译时运算符。(需要注意的是,当您有可变长度数组时,可以在运行时评估 sizeof)
推荐阅读
- autohotkey - Compiled autohotkey file does not run, uncompiled works
- latex - Render latex preview of equation like in latex export (with preceeding/trailing newline)
- laravel - How can i upload images without waiting user to upload images Laravel
- javascript - 如何修复:警告:无法对未安装的组件执行 React 状态更新
- python - 如何取消隐藏 Excel 文件中的行和列并将它们连接到 Pandas 数据框中?
- apache-kafka - 会话窗口如何计算差距?
- kubernetes - DockerInDocker:在 docker 镜像构建时 pip install 失败
- mysql - 匹配来自不同表的行 - MySQL
- paypal - 买方直接向卖方付款的市场的 Paypal 结帐
- c - 班次和班次分配给出不同的结果