c - 无明显原因的变量被覆盖
问题描述
我正在用 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)
只是为了让我找出我必须绘制的最大小时数,
解决方案
您的所有数组声明都排除了以零字节结尾的字符串的空间。
它应该是:
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
访问一些随机的内存数据。
推荐阅读
- python - PDF页面“AttributeError:'NoneType'对象没有属性'endStream'”
- javascript - 如何获取 JSON 中现有特定名称的数量
- javascript - 'RequestError: Error: Invalid URI' 上传文件以解析服务器云时
- react-native - 当 TextInput 上的 editable={false} 时滚动不起作用。仅限安卓
- python - 无法在文本文件中写入多个字段
- r - 相当于选择 i.*
- javascript - 如何使用 foreach 将值设置为数组
- javascript - 如何从html向js发送数据
- performance - 解释器语言比编译器语言慢的主要原因是什么?
- java - Flink : 以集群模式加载资源文件