我怎么知道C++数组的长度

How can I know legth of array in C++

本文关键字:数组 C++ 我怎么知道      更新时间:2023-10-16

可能的重复项:
C 编程语言中数组的大小?

有一个字符数组,我想在一个函数中处理它,我尝试了这样的代码:

int main(){
    char *word = new char [5];      
    /*here we make this word
    ....
    */
    process(word);
    puts(word);
}
void process(char *word){
    int sizeOfWord = sizeof(word)-1;
    /* here is cycle that process the word, I need it lenght to know how long cycle must be
    .....
    */
}

但是我无法获得带有sizeof数组的长度.为什么?我怎样才能得到它?

你不能。使用指针,无法知道大小。

你应该做的是,把word的长度也传递给你的process


您应该知道数组和指针之间存在差异。数组确实是许多元素,因此数组sizeof给出其大小(以字节为单位)。另一方面,指针只是一个地址。它甚至可能不指向数组。由于 sizeof 运算符是在编译时计算的(可变长度数组除外),因此它无法知道您的意思。

想想这个例子:

void process(char *word);
int main(){
    char *word = new char [5];
    char *word2 = new char [10];
    process(word);
    process(word2);
    /* ... */
}
void process(char *word){
    int sizeOfWord = sizeof(word)-1;  // what should this be?
    /* ... */
}

现在,知道在这种情况下sizeof是在编译时计算的,您认为它应该获得什么值? 510


旁注:看起来您正在将此数组用作字符串。在这种情况下,您可以使用 strlen .

U应该改用strlen()

编辑:假设您的word是有效的单词,末尾带有

无论如何,您使用c++所以您应该使用一些容器,例如 std::string .

如果您的数组始终是char*const char*并且包含以 null 结尾的字符串,则可以使用 strlen ,甚至更容易使用 std::string 类及其适当的方法。

如果它不是一个以空结尾的字符串(例如,它是一个纯字节数组,或者你的问题是关于一般数组的,char只是一个示例),请使用std::vector<char>std::array<char, 5>并调用他们的.size()方法。

由于数组在这样的代码中"衰减"为指向其第一个元素的指针,因此您不能这样做。指针"不知道"它指向的内存块有多大。您需要单独传递尺寸,例如

void process(char *word, size_t length);
只有

一种方法可以知道 C/C++ 中数组的长度:已经知道它。您需要将数组的长度作为另一个参数传递。

如果你专门谈论字符串,请在数组中搜索空字符,然后使用其索引 + 1 作为长度(这基本上是 strlen() 函数所做的)。

否则,也许你可以只使用 std::string 代替,然后获取它的 length 属性?

要么必须将数组的长度传递给 process 函数,要么使用 null ( ) 字符来标记结尾。

假设后者您可以使用

void process(char *word)
{
  while (*word)
  {
    //do stuff with the character *word
    ++word;
   }
}

不,它不起作用。 sizeof指针仅返回指针类型的大小,而不返回数组的大小。当您将数组作为参数传递给函数时,数组会衰减为指针,这意味着编译器将不再知道它到底指向什么,如果它是一个数组,它可以有多长。在函数中了解它的唯一方法是

  • 将长度作为附加参数传递,或
  • 向数组添加一个额外的终止符元素。

请注意,C 和 C++ 中的数组不会以任何方式存储它们的大小,因此程序员必须牢记这一点并相应地进行编程。在上面的代码中,您知道a的实际大小为 5,但编译器(和运行时)无法知道它。如果您将其声明为数组,即

char[] word = new char [5];

编译器将跟踪其大小,sizeof将在此声明范围内返回此大小(以字节为单位)。这允许人们应用一个众所周知的习语来获取数组的实际大小:

int size = sizeof(a) / sizeof(char);

但同样,这只有在编译器知道a实际上是一个数组时才有效,因此在函数调用中不可能将a作为(指针)参数传递。

在Windows上,_msize函数可以获取堆上分配的内存大小(以字节为单位)。在VS2005和VS2008中,它与运算符new完美配合,因为它使用malloc来分配内存。我必须注意:

这不是标准方式,所以你不应该使用它!

Object * addr = new Object[xxx];
size_t number_of_objects = _msize(addr) / sizeof(Object);

其他答案已经详细解释了为什么你不能得到经典 C 数组的大小,但我想指出以下几点。

您的示例缺少

delete [] word;

在主的末尾。否则会出现内存泄漏。

这说明了为什么在C++中使用数组的首选方法是使用std::vector或 - 在固定长度的情况下 - 新std::array,在字符串的情况下std::string。编译器将为您管理基础存储。所有这些类都提供size函数。