正确初始化2D struct char数组的方法

时间:2015-07-16 04:41:31

标签: c arrays struct

转子[0] [0] .order末端的额外Q来自转子[0] [0] .notch。造成这种情况的原因是什么以及应该采取哪些措施来避免这种连接?

#include <stdio.h>

struct rotor_wirings
{
    char order[26];
    char notch[2];
};
/* rotor[MODEL][ROTORNAME] */
struct rotor_wirings rotor[10][10] =
{
    /* Commercial Enigma A, B */
    {
        { "DMTWSILRUYQNKFEJCAZBPGXOHV", "Q" },
        { "HQZGPJTMOBLNCIFDYAWVEUSRKX", "E" }
    }
};

int main()
{
    printf("First rotor is: %s\n", rotor[0][0].order);
    return 0;
}

输出结果为:

First rotor is: DMTWSILRUYQNKFEJCAZBPGXOHVQ

4 个答案:

答案 0 :(得分:3)

您没有为order字符串末尾的空尾留出空间。它应该是

char order[27];

答案 1 :(得分:0)

你已经写了所有26个字节,没有留下空间来终止'\0' char,因此,挑衅Undefined Behavior。使用 27个字符数组,您将获得所需的输出。 Live Example

struct rotor_wirings
{
    char order[27]; // Extra byte for terminating '\0'
    char notch[2];
};

答案 2 :(得分:0)

它是一个内存对齐问题,并且您尚未声明足够的空间让您的订单数组无效,以修复此特定代码:

char order[27];
结构中的

会修复它,如果你很好奇为什么会发生这种情况虽然因为缺口变量地址紧跟在后面并且printf然后找到了空终止。

参考:https://en.wikipedia.org/wiki/Data_structure_alignment

答案 3 :(得分:-1)

一种方式可能是这样的:

struct rotor_wirings rotor[10][10] =
{
    /* Commercial Enigma A, B */
    {
        { "DMTWSILRUYQNKFEJCAZBPGXOHVQ"},
        { "HQZGPJTMOBLNCIFDYAWVEUSRKXE" }
    }
};