首页 > 解决方案 > 无明显原因的变量被覆盖

问题描述

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

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

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)只是为了让我找出我必须绘制的最大小时数,

标签: cbuffer-overflow

解决方案


您的所有数组声明都排除了以零字节结尾的字符串的空间。

它应该是:

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

您要在其中保存EVENT_NAME_SIZE空格或b字符以及 8个|字符。

和:

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

如果要将EVENT_NAME_SIZE字符存储在字符串中,则需要EVENT_NAME_SIZE空格字节加上一个字节来终止零字符。

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


推荐阅读