【问题标题】:C++ Size of char* buffer [duplicate]char *缓冲区的C ++大小[重复]
【发布时间】:2020-07-16 01:00:56
【问题描述】:

有没有办法通过 C++ 中的 char* 指针来确定 char[] 缓冲区的大小?我使用的是 C++98。

以下代码行都打印出'8'(本质上是sizeof(char*))。但是我正在寻找缓冲区的实际大小。

int maxBufferLen = 24;
char* buffer = new char[maxBufferLen];

std::cout << sizeof(buffer) << std::endl; // prints '8'
std::cout << ( sizeof(buffer) / sizeof(buffer[0]) ) << std::endl; // prints '8'

实际上,我在函数之间传递了 char* 缓冲区,我将无法访问我用来初始化它的 maxBufferLen 变量。因此,我需要使用另一种方法来确定长度。

【问题讨论】:

  • 抱歉,这是不可能的。 C++ 不能以这种方式工作。您必须自己跟踪所有动态分配数组的大小,方法是在某处以某种形式或方式存储每个数组的显式大小。
  • 这就是为什么存在像std::vectorstd::string 这样的类。没有它们,您必须跟踪所有这些尺寸。
  • 如果您以struct mybuf { char* buffer; size_t size; }; 开头并添加“少数”成员函数和免费函数,那么您就回家了:std::string
  • 你没有得到sizeof(char),根据定义是1。你会得到sizeof(char*) 或指针的大小。

标签: c++ char buffer c++98


【解决方案1】:

一般没有办法根据指向数组元素的指针来确定数组的大小。

以下是找出大小的典型方法:

  • 将大小存储在变量中
    • 此方法的一个变体是将指针和大小(或者,指针超过末尾)存储为类的成员。这种方法的一个例子是 std::span 类模板(这个标准类不在 C++98 中,但您可以编写自己的受限版本)。
      • 通常在动态分配数组时(例如在您的示例中)使用的变体 this 是在类的析构函数中释放内存并符合 RAII 习惯用法。这种方法的例子有std::stringstd::vector
  • 或者选择某个元素值来表示数组的最后一个元素。在迭代数组时,遇到这个“终结者”元素会告诉你已经到了终点。这通常与字符串一起使用,尤其是在使用空终止符 ('\0') 的 C 接口中。

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2014-07-23
    • 2011-11-26
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多