c++ - 将 char 数组转换为结构的问题。结构的char数组变量溢出
问题描述
我想将 char 数组转换为结构,但在打印时我得到以下输出
输出:测试世界(第 1 行) st 世界(第 2 行)
#pragma(1)
struct MyStruct
{
char a[2];
char b[5];
};
int main()
{
char test[11] = "Test World";
char *c = test;
struct MyStruct *Test = (MyStruct*)(c);
cout << Test->a << endl;
cout << Test->b;
cin.ignore();
return 0;
}
我想要根据结构变量的大小输出。我的预期输出: Te(第 1 行) st wo(第 2 行)
解决方案
你的程序有几个问题。
MyStruct
首先,您通过不指向MyStruct
(也不兼容的)对象的指针间接。因此程序的行为是未定义的。
其次,字符串Te
根本不适合,MyStruct::a
因为没有足够的空间。该字符串Te
包含三个字符,并且MyStruct::a
只有 2 个字符。只有字符是T
和e
适合的,但没有空终止符的空间,所以它不能是空终止的字符串。同样的问题是您对适合的内容的期望MyStruct::b
。
也许您的意图是不使用以空字符结尾的字符串,但是您的问题是您将非以空字符结尾的字符数组插入到标准流中std::cout
,这要求参数是以空字符结尾的字符串。由于违反此要求,程序的行为将是未定义的。
这是一个可能的片段,它具有明确定义的行为并具有所需的输出:
MyStruct Test;
std::memcpy(&Test, test, sizeof Test);
for(char c : Test.a)
std::cout << c;
std::cout << '\n';
for(char c : Test.b)
std::cout << c;
推荐阅读
- build - 如何处理不同版本的依赖?
- python - AttributeError:LstmNetwork 实例没有属性“x_list_add”
- django - 从 Django 数据库模型中获取项目
- react-native - 如何在 react native 中将状态变量设置为组件的属性?
- android - 如何为android和ios的appium自动化运行单一代码结构?
- javascript - After passing the value from JavaScript to C#, how to do some automatic operation with it?
- android - 张量流 LSTM 不起作用
- angular - Nativescript procudes bootstrap: StaticInjectorError(AppModule)[EffectSources -> ErrorHandler]:
- sed - 如何在不使用 sed 在保持空间中插入新行的情况下从模式空间追加到保持空间?
- asp.net-mvc - 选择不按它们被选择的顺序出现 - Select2 js