了解字符数组初始化和数据存储

时间:2017-04-17 05:59:26

标签: c++ arrays char reinterpret-cast

我试图了解如何初始化字符数组以及如何存储数据。

我做了一个测试,这是怎么回事

struct test
{
    char one  [2];
    char two  [2];
    char three[2];
};

test * testptr;

char testchar[] = "hello";

testptr = reinterpret_cast<test*>(testchar);

cout << testptr->one << endl;
cout << testptr->two << endl;
cout << testptr->three << endl;

我期待看到类似的东西:

he
ll
o

然而,当我恭维时,我得到:

hello
llo
o

我不明白onetwo如何包含比大小更多的字符,当我为变量做sizeof时,它们都变成{{1就像它初始化的大小一样。

如果完成了2这样的事情:

cout

结果是:

for (int i = 0; i < 6; i++)
{
    cout << testptr->one[i] << endl;
}

如果我超过h e l l o ,那么它将是空的或垃圾。

我知道我可以使用6很好地将数量的字节分配到数组中,但是我试图理解固定大小的字符数组如何能够存储更多它能容纳的内容。

2 个答案:

答案 0 :(得分:1)

当您reinterpret_cast char[]struct*时,指向onetwothree的指针指向第0,第2,和输入字符串中的第4个字符(由于每个变量的大小为2,因此间距为2,因此类似于ptrptr + 2ptr + 2 + 2)。

h e l l o
^   ^   ^
|   |   |
0   2   4

此外,C ++中的char*由NULL字符('\0')终止。因此,当您打印onetwothree的值时,我们会看到从开头到结尾的所有字符。

答案 1 :(得分:0)

您可以在for循环中打印每个char数组值,直到它们的大小来满足您的要求,而不是使用cout。

#include <string.h> 
#include <iostream>
using namespace std;
struct test
{
    char one  [2];
    char two  [2];
    char three[2];
    test()
    {
        cout<<"in test"<<endl;
        memset(&one,NULL,3);
        memset(&two,NULL,3);
        memset(&three,NULL,3);
    }
    void display()
    {
        cout<<" one   two   three"<<endl;
        for(int i=0;i<2;i++)
        {
            cout<<one[i]<<"  "<<two[i]<<"  "<<three[i]<<endl;
        }
        cout<<endl;
   }

};
main()
{
    test  testobj;
    test  *testptr = &testobj;
    char testchar[] = "hello";
    testptr->display();
    testptr = reinterpret_cast<test*>(testchar);
    testptr->display();
    cout << testptr->one << endl;
    cout << testptr->two << endl;
    cout << testptr->three << endl;
}

输出:

在测试中  一二三

一二三

h l o

e l

您好 LLO Ø