首页 > 解决方案 > 为什么`sizeof`运算符和delete []运算符可以使用数组大小​​信息,但在将数组作为参数传递给函数时却不能

问题描述

我想知道sizeofoperator 和如何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;
}

标签: c++arrays

解决方案


delete[]操作员知道有多少内存与特定指针值相关联的原因是因为它在new[]使用时写入的内部数据结构中保存了该值的副本。从严格的语言角度来看,它不知道指针指向多少内存。

还有一个要求是delete[] 必须new[]. 传入任何其他指针值都会导致未定义的行为

sizeof运算符仅查看其操作数的类型,因此在编译时进行评估。在您的代码中,sizeof运算符可以看到其操作数具有类型int[3]并计算为数组的字节大小(大多数系统上为 12)。

当您将数组传递给函数时,它会衰减为指向数组第一个元素的指针。所以在my_function你只有一个指针。你可以很容易地做这样的事情:

int x;
my_function(&x, 1);

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


推荐阅读