sizeof静态数组成员返回指针的大小而不是数组

xav*_*sjs 0 c++ arrays sizeof static-array

所以我有一个C++结构,它有一个静态数组作为成员,我想在构造函数中询问它的大小.正如我从本文http://msdn.microsoft.com/en-us/library/4s7x1k91(VS.71).aspx所理解的那样,sizeof可以应用于静态数组以查找整个大小(以字节为单位)数组,而不仅仅是它的类型.但是,当我sizeof()对成员执行时,它给出了4(指针的大小)而不是数组的大小.这是上下文(平凡的):

struct A
{
    char descirption[128];
    int value;

    A(const char desc[], int val)
    {
        size_t charsToCopy = std::min(sizeof(description), sizeof(desc));
        memcpy(description, desc, charsToCopy);
        value = val;
    }
}

int main()
{
    A instance("A description string", 1);
    //now instance has a description string that says "A des" followed by garbage characters
}
Run Code Online (Sandbox Code Playgroud)

那么我如何获得成员char数组的大小?

编辑

当我在编译器中放置一个断点并检查这两个值时sizeof(description),sizeof(desc)我看到了sizeof(description) == 4,和sizeof(desc) == 21.因此我的困惑.因为我正在将一个字符串文字传递给构造函数,所以编译器似乎很高兴告诉我传入的字符串的实际大小.如果我将它分配给某个地方的某个变量,可能就不会这样了,但是现在我我试图追查根本问题:sizeof(some-member-static-array)给了我一些(相对)毫无意义的东西.

sizeof是否可能正在进行某种字符串长度测量,因为它是一组字符?

Mik*_*our 5

尽管有语法,但您无法通过值将数组传递给函数.它衰减到指针,无法找到大小; 你的功能相当于

A(const char * desc, int val)
Run Code Online (Sandbox Code Playgroud)

sizeof(desc)是指针的大小.

您可以通过引用传递数组,通过数组的大小模板化函数:

template <size_t desc_size>
A(const char (&desc)[desc_size], int val)
Run Code Online (Sandbox Code Playgroud)

size参数将从函数参数自动推断,因此传递字符串文字的代码将按原样运行.

但是,这仅在参数确实是已知大小的数组时才有效; 如果你想处理更一般的字符串,那么你需要更复杂的东西.通常,使用它std::string来管理字符串更方便- 它自动处理内存,并为您跟踪大小.