为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到



我想知道sizeof运算符和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);

因此,如果要在参数上使用sizeofp它会查看int *的操作数类型,并计算指针的大小(很可能是 4 或 8(。

最新更新