一个变量被无缘无故地覆盖
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
正在访问内存的一些随机数据。
我正在用 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
正在访问内存的一些随机数据。