c++ - 为什么`sizeof`运算符和delete []运算符可以使用数组大小信息,但在将数组作为参数传递给函数时却不能
问题描述
我想知道sizeof
operator 和如何delete[]
知道他们正在操作的数组的实际大小,但是当我将数组作为参数传递给函数时,大小信息会丢失,大小信息需要通过显式传递给函数程序员?
导致这种差异的内在机制是什么?
#include <iostream>
void my_function(int* p, int n) {
std::cout << "when passed into a function as argument, array size information is not available" << std::endl;
}
int main() {
int a[] = { 1, 2, 3 };
std::cout << "sizeof(a): " << sizeof(a) << std::endl; // size information available to `sizeof` operator
int* b = new int[3] {1, 2, 3};
delete[] b; //size information available to `delete[]` operator
int c[] = { 1, 2, 3 };
my_function(c, 3);
return 0;
}
解决方案
delete[]
操作员知道有多少内存与特定指针值相关联的原因是因为它在new[]
使用时写入的内部数据结构中保存了该值的副本。从严格的语言角度来看,它不知道指针指向多少内存。
还有一个要求是delete[]
必须由new[]
. 传入任何其他指针值都会导致未定义的行为。
sizeof
运算符仅查看其操作数的类型,因此在编译时进行评估。在您的代码中,sizeof
运算符可以看到其操作数具有类型int[3]
并计算为数组的字节大小(大多数系统上为 12)。
当您将数组传递给函数时,它会衰减为指向数组第一个元素的指针。所以在my_function
你只有一个指针。你可以很容易地做这样的事情:
int x;
my_function(&x, 1);
因此,如果您要sizeof
在参数上使用,p
它会查看操作数的类型,int *
并评估指针的大小(很可能是 4 或 8)。
推荐阅读
- c# - 如何清除 Microsoft App Center 上次会话崩溃报告?
- google-apps-script - Google Scripts Chart 语法以及如何为烛台图着色
- hive - Spark shell 和 spark 数据框为 parquet 文件提供不同的结果
- reactjs - 在 React Modal 中使用正确的数据设置状态
- swift - 从 Indexpath 获取 collectionView 的 HeaderView 参考
- vb.net - 向客户端 PC 部署 vb.net 和水晶报告
- algorithm - 如何在有向图中找到第一个节点和所有其他节点之间所有可能路径的计数?
- python - 稀疏矩阵 hstack 得到关于可下标性的错误
- nativescript - nativescript相机中的自定义布局以及android上的自定义布局根本不可见
- sql - SQL Server:从第一行减去最后一行