gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:45:23 24 4
gpt4 key购买 nike

我正在用 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 正在访问一些随机数据内存。

关于c - 一个变量被无缘无故地覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57598233/

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