C++:sizeof表示数组长度

Nic*_*ner 3 c++ macros

假设我有一个叫做的宏LengthOf(array):

sizeof array / sizeof array[0]
Run Code Online (Sandbox Code Playgroud)

当我制作一个23号的新阵列时,我不应该回来23 LengthOf吗?

WCHAR* str = new WCHAR[23];
str[22] = '\0';
size_t len = LengthOf(str); // len == 4
Run Code Online (Sandbox Code Playgroud)

为什么len == 4

更新:我做了一个错字,这是一个WCHAR*,而不是一个WCHAR**.

Mar*_*off 12

因为str这是指向指针的指针,而不是数组.

这是指针和数组之间的细微差别之一:在这种情况下,您的指针位于堆栈上,指向已在其他位置分配的23个字符的数组(可能是堆).


Jer*_*fin 11

WCHAR** str = new WCHAR[23];
Run Code Online (Sandbox Code Playgroud)

首先,这甚至不应该编译 - 它试图分配pointer to WCHAR给a pointer to pointer to WCHAR.编译器应该根据这种不匹配来拒绝代码.

其次,sizeof(array)/sizeof(array[0])宏的一个已知缺点是,当应用于指针而不是真实数组时,它可以并且将完全失败.在C++中,您可以使用模板来获取拒绝的代码:

#include <iostream>

template <class T, size_t N>
size_t size(T (&x)[N]) { 
    return N;
}

int main() { 
    int a[4];
    int *b;

    b = ::new int[20];

    std::cout << size(a);      // compiles and prints '4'
//    std::cout << size(b);    // uncomment this, and the code won't compile.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)