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是否可能正在进行某种字符串长度测量,因为它是一组字符?
尽管有语法,但您无法通过值将数组传递给函数.它衰减到指针,无法找到大小; 你的功能相当于
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
来管理字符串更方便- 它自动处理内存,并为您跟踪大小.