了解字符数组初始化和数据存储
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
我不明白为什么 one
和 two
包含的字符比大小本身多,当我对变量执行 sizeof
时,它们都变成了 2
,和初始化时的大小一样。
如果像这样的 cout
完成:
for (int i = 0; i < 6; i++)
{
cout << testptr->one[i] << endl;
}
结果是:
h
e
l
l
o
如果我超过 6
,它要么是空的,要么是垃圾。
我知道我可以使用 memcpy
将字节数很好地分配到数组中,但我正在尝试了解固定大小的字符数组如何能够存储更多的内容。
当你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 字符 ('[=21=]'
) 结尾。因此,当您打印 one
、two
和 three
的值时,我们会看到从头到尾的所有字符。
您可以在 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
我想了解字符数组是如何初始化的以及数据是如何存储的。
我做了一个测试,结果是这样
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
时,它们都变成了 2
,和初始化时的大小一样。
如果像这样的 cout
完成:
for (int i = 0; i < 6; i++)
{
cout << testptr->one[i] << endl;
}
结果是:
h
e
l
l
o
如果我超过 6
,它要么是空的,要么是垃圾。
我知道我可以使用 memcpy
将字节数很好地分配到数组中,但我正在尝试了解固定大小的字符数组如何能够存储更多的内容。
当你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 字符 ('[=21=]'
) 结尾。因此,当您打印 one
、two
和 three
的值时,我们会看到从头到尾的所有字符。
您可以在 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