一个变量被无缘无故地覆盖

A variable is being overwritten for no apparent reason

我正在用 C 编写一个调度程序,为了打印它,我准备了一个函数来打印一个 table,名称和时间为 "events"。 为了打印 tables 我在每一行之后都有一个分隔符,基本上是“|=======|========|=======|。 ....”,所以我将它保存在一个变量中并尝试使用它来打印。出于某种原因,我用值溢出了它。

我尝试找出错误所在,并且尝试减少添加到其后定义的字符串中的字符数量(以防止溢出),但这些都不起作用

char line_break[] = "|====================|====================|====================|====================|====================|====================|====================|";
printf("\n|       Sunday       |       Monday       |       Teusday      |      Wedensday     |      Thursday      |       Friday       |      Saturday      |\n%s\n",line_break);

for (int i=0; i < max(schedule_index);i++) {
    char events[8+EVENT_NAME_SIZE*7] = {0};
    char  hours[8+EVENT_NAME_SIZE*7] = {0};
    strcat(events, "|");
    strcat(hours,  "|");
    for (int day=0; day < DAYS_PER_WEEK; day++) {
        char temp_events[EVENT_NAME_SIZE]= {0};
        char temp_hours[EVENT_NAME_SIZE] = {0};
        for (int i=0; i<EVENT_NAME_SIZE;i++) {
            temp_events[i] = ' ';
            temp_hours[i] = 'b';
        }

        strcat(events, temp_events);
        strcat(events, "|");

        strcat(hours, temp_hours);
        strcat(hours, "|");
    }

    printf("%s\n", events);
    printf("%s\n", hours);
    printf("%s\n", line_break);
}

每当我执行代码时,我都会得到以下信息:

|       Sunday       |       Monday       |       Teusday      |      Wedensday     |      Thursday      |       Friday       |      Saturday      |
|====================|====================|====================|====================|====================|====================|====================|
|                    |                    |                    |                    |                    |                    |                    |
|                    |                    |                    |                    |                    |                    |                    |
|bbbbbbbbbbbbbbbbbbbb|bbbbbbbbbbbbbbbbbbbb|bbbbbbbbbbbbbbbbbbbb|bbbbbbbbbbbbbbbbbbbb|bbbbbbbbbbbbbbbbbbbb|bbbbbbbbbbbbbbbbbbbb|bbbbbbbbbbbbbbbbbbbb|
bbbbbbbbbbbbbbbbb|

所以这就是我发现问题是 line_break 变量被 hours 变量覆盖的原因,但我仍然不知道为什么会这样。 EVENT_NAME_SIZE被声明为20,DAYS_PER_WEEK也是7,max(schedule_index)只是为了让我找出我必须画的最大小时数,

您的所有数组声明都排除 space 字符串终止零字节。

应该是:

char events[8+EVENT_NAME_SIZE*7+1] = {0};
char  hours[8+EVENT_NAME_SIZE*7+1] = {0};

您想在何处放置 EVENT_NAME_SIZE space 个或 b 个字符和 8 个 | 个字符。

和:

    char temp_events[EVENT_NAME_SIZE+1]= {0};
    char temp_hours[EVENT_NAME_SIZE+1] = {0};

如果要在字符串中存储 EVENT_NAME_SIZE 个字符,则需要 EVENT_NAME_SIZE 个字节的 space 加上一个用于终止零字符的字节。

strcat这样的函数需要以零结尾的数组。程序员还需要确保目的地有足够的 space 可用。第一个 strcat(events, temp_events); 的行为未定义 - temp_events 不是空终止的,因此 strcat 正在访问内存的一些随机数据。