嵌套结构+字符串问题

时间:2016-02-20 22:28:51

标签: c arrays string struct

我正在开展一个学校项目:我需要建立一个议程,您可以在其中插入和选择会议等。我使用结构来实现目标。 我把问题隔离开来以加快速度:

#include <stdio.h>
#include <stdlib.h>

struct year {
    struct {
        struct {
            char *time[23];
        } day[32];
    } month[13];
};

typedef struct year Year;

void main()
{
    Year agenda;
    printf("%s\n", agenda.month[11].day[31].time[3]);
}

现在,我在使用给定时间和for循环打印整个月的会议时遇到了这个问题。喜欢:每7月12:00 meetings打印一次。所以输出看起来像这样:

工作部分:

这是代码的好部分。相反,什么破坏了?它工作正常,直到你选择从1到9的月份。一旦我选择10/11/12,我得到:

破碎部分:

所以每当我尝试打印struct month数组的最后一个索引时,我会得到奇怪的字符而不是空字符串。当增加数组大小时也会发生这种情况,最后3个索引总是被打破。 怎么了?

我发现无用的复制我的原始代码,因为问题可以用我粘贴的小部分复制

1 个答案:

答案 0 :(得分:0)

问题是你根本不会初始化任何东西,因此你的代码试图取消引用导致未定义行为的无效指针。

帮助您的工作很少,因为您不清楚为什么要尝试打印尚未初始化的数据。

但是,您的混淆似乎与您认为未初始化的变量以某种方式初始化为0的事实有关。情况并非如此,出于性能原因,它们仍然是 UNINITIALIZED 。您需要明确初始化所有内容或声明它们具有static存储空间,以便它们自动初始化为0

某些值为0的事实只是巧合,因为0也可能是垃圾值。

但通常你想自己初始化它们,也就是说,你可以完全控制在你分配的内存中使用哪些数据。

这是代码如何正确运行的示例

#include <stdio.h>

struct year {
    struct {
        struct {
            char *time[23];
        } day[32];
    } month[13];
};

typedef struct year Year;

int
main(void)
{
    Year agenda;
    // Initialize the element of interest!
    agenda.month[12].day[31].time[22] = "Initialize me please\n";
    // Never try to write to `time[22]` because it points to
    // a string literal, and you can't modify them legaly.
    printf("%s\n", agenda.month[12].day[31].time[22]);
}

注意:我已将void main()更改为int main(void),如果您在void main()处读取了一个过时的资源,您应该避免使用现代标准要求main()返回int