1

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

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

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。为什么?我怎样才能得到它?

4

9 回答 9

3

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

你应该做的是,把长度也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在这种情况下是在编译时计算的,你认为它应该得到什么值?5? 10?


旁注:看起来您正在将此数组用作字符串。在这种情况下,您可以使用 轻松获得它的长度strlen

于 2012-06-15T08:39:30.627 回答
2

你应该strlen()改用。

编辑:假设你的最后word是有效的单词\0

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

于 2012-06-15T08:39:40.170 回答
2

如果您的数组始终为char*orconst char*并且包含以空字符结尾的字符串,您可以使用strlen,甚至更轻松地使用std::string该类及其适当的方法。

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

于 2012-06-15T08:41:48.340 回答
0

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

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

Object * addr = new Object[xxx];
size_t number_of_objects = _msize(addr) / sizeof(Object);
于 2012-06-15T08:45:08.017 回答
0

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

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

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

char[] word = new char [5];

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

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

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

于 2012-06-15T08:38:48.760 回答
0

由于数组在这样的代码中“衰减”为指向它们的第一个元素的指针,所以你不能。指针不“知道”它指向的内存块有多大。您需要单独传递大小,例如

void process(char *word, size_t length);
于 2012-06-15T08:39:46.263 回答
0

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

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

否则,也许您可​​以只使用 std::string ,然后获取它的长度属性?

于 2012-06-15T08:40:48.823 回答
0

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

假设后者你可以使用

void process(char *word)
{
  while (*word)
  {
    //do stuff with the character *word
    ++word;
   }
}
于 2012-06-15T08:41:21.973 回答
0

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

您的示例缺少一个

delete [] word;

在主要的末尾。否则你有内存泄漏。

这说明了为什么在 C++ 中使用数组的首选方法是使用std::vectoror - 在固定长度的情况下 - 新的std::array和在字符串的情况下std::string。编译器将为您管理底层存储。所有这些类都提供了一个size功能。

于 2012-06-15T09:27:18.823 回答