首页 > 解决方案 > 将 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 行)

标签: c++arraysdata-structurescasting

解决方案


你的程序有几个问题。

MyStruct首先,您通过不指向MyStruct(也不兼容的)对象的指针间接。因此程序的行为是未定义的。

其次,字符串Te根本不适合,MyStruct::a因为没有足够的空间。该字符串Te包含三个字符,并且MyStruct::a只有 2 个字符。只有字符是Te适合的,但没有空终止符的空间,所以它不能是空终止的字符串。同样的问题是您对适合的内容的期望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;

推荐阅读