我试图了解如何初始化字符数组以及如何存储数据。
我做了一个测试,这是怎么回事
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
我不明白one
和two
如何包含比大小更多的字符,当我为变量做sizeof
时,它们都变成{{1就像它初始化的大小一样。
如果完成了2
这样的事情:
cout
结果是:
for (int i = 0; i < 6; i++)
{
cout << testptr->one[i] << endl;
}
如果我超过h
e
l
l
o
,那么它将是空的或垃圾。
我知道我可以使用6
很好地将数量的字节分配到数组中,但是我试图理解固定大小的字符数组如何能够存储更多它能容纳的内容。
答案 0 :(得分:1)
当您reinterpret_cast
char[]
到struct*
时,指向one
,two
和three
的指针指向第0,第2,和输入字符串中的第4个字符(由于每个变量的大小为2,因此间距为2,因此类似于ptr
,ptr + 2
,ptr + 2 + 2
)。
h e l l o
^ ^ ^
| | |
0 2 4
此外,C ++中的char*
由NULL字符('\0'
)终止。因此,当您打印one
,two
和three
的值时,我们会看到从开头到结尾的所有字符。
答案 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 Ø