C 嵌套结构&x2B;字符串问题

C 嵌套结构&x2B;字符串问题,c,arrays,string,struct,C,Arrays,String,Struct,我正在做一个学校项目:我需要建立一个议程,你可以在其中插入和选择会议等。我使用structs让事情进展顺利。 我隔离了这个问题以加快事情的发展: #include <stdio.h> #include <stdlib.h> struct year { struct { struct { char *time[23]; } day[32]; } month[13]; }; typedef struc

我正在做一个学校项目:我需要建立一个议程,你可以在其中插入和选择会议等。我使用structs让事情进展顺利。 我隔离了这个问题以加快事情的发展:

#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]);
}
#包括
#包括
结构年{
结构{
结构{
字符*时间[23];
}第[32]天;
}月[13];
};
类型定义结构年;
void main()
{
国际年议程;
printf(“%s\n”,agenda.month[11]。day[31]。time[3]);
}
现在,我在使用给定的时间和for循环打印整整一个月的会议时遇到了这个问题。例如:打印7月的每一次
12:00会议。所以输出应该是这样的:

工作部分:

这是代码的好部分。相反,什么是坏的?在您选择1到9个月之前,它工作正常。一旦我选择了12年11月10日,我会得到:

破损部分:

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


我发现复制我的原始代码是没有用的,因为这个问题可以用我粘贴的一小部分复制

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

没有什么可以帮助您的,因为不清楚您为什么要打印尚未初始化的数据

但您的困惑似乎与以下事实有关:您认为未初始化的变量以某种方式初始化为
0
。事实并非如此,出于性能原因,它们未初始化。您需要明确地初始化所有内容或声明它们具有
静态
存储,以便它们自动初始化为
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]);
}
#包括
结构年{
结构{
结构{
字符*时间[23];
}第[32]天;
}月[13];
};
类型定义结构年;
int
主(空)
{
国际年议程;
//初始化感兴趣的元素!
议程。月[12]。日[31]。时间[22]=“请初始化我\n”;
//永远不要试图写信给“时间[22]”,因为它指向你
//一个字符串文本,您不能合法地修改它们。
printf(“%s\n”,agenda.month[12]。day[31]。time[22]);
}

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

@iharob抱歉,我是一个新用户,对编程非常陌生。虽然我很抱歉我问这个问题的方式,我也感谢为我解决这个问题的用户,“请尝试理解为什么这是错误的”,这有点粗鲁,根本帮不了我。如果你不感兴趣,请远离评论。我非常抱歉,我试图写一个答案,但后来我写了不必要的粗鲁评论。我的意思是问,“为什么您希望数组的内容为空?”。我现在已经回答了您的问题,对以前的情况感到抱歉。@iharob谢谢您的回答。实际上,我无法回答你,因为我假设也有随机内容,直到我发现从0到9的子数组(是正确的单词吗?)的每一部分都包含空字符串。所以问题可能恰恰相反,为什么呢?这让我在这里问,是什么让结构的这部分从0到9(1月到10月)为null,从10到12填充?null是一种垃圾,不是吗?未定义的值包括
0
+1我没有初始化这些数组的原因是我希望程序只打印空内容,以防我没有在其中插入任何值。这让我觉得我遵循了正确的方法,实际上忽略了将它们初始化为0。正如你所指出的,这显然是错误的。是的,我的大学课本似乎过时了:P。将努力提高我的经验,并希望像你对待我那样帮助别人。你真是太酷了。谢谢