静态数组成员的尺寸返回指针的大小,而不是阵列

sizeof static array member returns the size of the pointer and not the array

本文关键字:阵列 指针 组成员 数组 返回 静态      更新时间:2023-10-16

所以我有一个C 结构,该结构具有静态数组作为成员,我想在构造函数中询问它的大小。正如我从本文中理解的那样数组,而不仅仅是类型。但是,当我对成员进行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
}

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

编辑

当我在编译器中放一个断点并检查两个值sizeof(description)sizeof(desc)时,我会看到sizeof(description) == 4,以及sizeof(desc) == 21。因此,我的困惑。因为我将字符串字面的字符串传递到构造函数中,所以编译器似乎很乐意告诉我字符串的实际尺寸。'试图追踪基本问题:SizeOf(某个成员静态阵列)给了我一些(相对)毫无意义的东西。

SizeOf可能会进行某种字符串长度测量,因为它是一个字符的数组?

尽管语法,您仍无法按值将数组传递给函数。它腐烂到指针,无法找到尺寸。您的功能等于

A(const char * desc, int val)

使sizeof(desc)是指针的大小。

您可以通过引用传递数组,通过数组的大小将功能模板:

template <size_t desc_size>
A(const char (&desc)[desc_size], int val)

大小参数将自动从函数参数中自动推断,因此您的代码传递字符串字面的文字将按原样工作。

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

不是给您4个大小的成员,而是参数。C 中的数组类型参数已转换为指针,因此您的构造函数等于:

A(const char *desc, int val)

这就是为什么您要获得指针的大小。如果您真的想使用memcpy,则必须将数组的长度传递给构造函数。另一种选择是使用strncpy,最大数量设置为128。

当然,如果您使用的是std::string,则不会遇到这个问题。

在此构造函数中

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

参数desc被编译器隐式转换为指向其第一个字符的指针。当您使用函数std :: min时,很明显,sizeof(const char *)小于sizeof(description),并且函数将始终返回4,前提是指针的大小等于4。

此外,可能会出现所得字符串在呼叫后,将不包含终端零。我会以以下方式定义构造函数

A(const char desc[], int val)
{
    strncpy(description, desc, 128);
    description[127] = '';
    value = val;
}

也是使用燃烧器或静态常数定义魔术编号128的名称的好主意。

或至少您可以编写以下方式

A(const char desc[], int val)
{
    const size_t N = sizeof( description );
    strncpy(description, desc, N);
    description[N-1] = '';
    value = val;
}