gpt4 book ai didi

c - 嵌套结构+字符串问题

转载 作者:行者123 更新时间:2023-11-30 20:36:37 25 4
gpt4 key购买 nike

我正在开展一个学校项目:我需要建立一个议程,您可以在其中插入和选择 session 等。我使用结构来让事情顺利进行。我隔离了这个问题以加快速度:

#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 循环打印一整月的 session 时遇到了这个问题。例如:打印 7 月的每个 12:00 session 。所以输出看起来像这样:

工作部分:

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

损坏的部分:

因此,每次我尝试打印 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]);
}

注意:如果您阅读 void main(),我已将 void main() 更改为 int main(void) ) 某处可能是过时的资源,自现代以来您应该避免使用 标准要求 main() 返回 int

关于c - 嵌套结构+字符串问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35529880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com