我正在开展一个学校项目:我需要建立一个议程,您可以在其中插入和选择会议等。我使用结构来实现目标。 我把问题隔离开来以加快速度:
#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个索引总是被打破。
怎么了?
我发现无用的复制我的原始代码,因为问题可以用我粘贴的小部分复制
答案 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()
处读取了一个过时的资源,您应该避免使用现代c标准要求main()
返回int
。