0

所以我有一个 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
}

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

编辑

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

sizeof 是否有可能因为它是一个字符数组而进行某种字符串长度测量?

4

3 回答 3

5

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

A(const char * desc, int val)

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

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

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

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

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

于 2014-02-03T12:15:38.873 回答
2

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

A(const char *desc, int val)

这就是为什么你得到一个指针的大小。如果您真的想使用memcpy,则必须将数组的长度传递给构造函数。另一种方法是使用strncpy最大字符数设置为 128。

当然,如果您使用的是std::string,则不会出现此问题。

于 2014-02-03T12:06:30.203 回答
0

在这个构造函数中

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。

此外,在调用 memcpy 之后,结果字符串可能不包含终止零。我将通过以下方式定义构造函数

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

此外,使用枚举器或静态常量定义幻数 128 的名称也是一个好主意。

或者至少你可以这样写

A(const char desc[], int val)
{
    const size_t N = sizeof( description );
    strncpy(description, desc, N);
    description[N-1] = '\0';
    value = val;
}
于 2014-02-03T12:20:12.033 回答