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

Understanding Character array initialization and data storing

我想了解字符数组是如何初始化的以及数据是如何存储的。

我做了一个测试,结果是这样

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 时,它们都变成了 2,和初始化时的大小一样。

如果像这样的 cout 完成:

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

结果是:

h
e
l
l
o

如果我超过 6,它要么是空的,要么是垃圾。

我知道我可以使用 memcpy 将字节数很好地分配到数组中,但我正在尝试了解固定大小的字符数组如何能够存储更多的内容。

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

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

此外,C++ 中的 char* 以 NULL 字符 ('[=21=]') 结尾。因此,当您打印 onetwothree 的值时,我们会看到从头到尾的所有字符。

您可以在 for 循环中打印每个字符数组值,而不是使用 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;
}

输出:

测试中 一二三

一二三

hlo

e l

你好 llo o