【发布时间】:2021-12-13 21:18:09
【问题描述】:
我写一个简单的编译器只是为了好玩,我希望每一行都有适当的缩进。
所以我写了一个函数,它根据数字返回一个带有一些空格的字符数组。
问题是,当生成数组时,在文件中写入或打印时,某些字符似乎是错误的。我认为它们是从带有一些信息的内存位置获取的,因为我看到了文件路径的片段。
我做了一个有同样问题的示例代码
int num = 0;
char *tabs;
for (; num < 20; num++)
{
tabs = malloc(num);
memset(tabs, '-', num);
printf("%d | %sEND\n", num, tabs);
}
(我想这不是最好的代码,但我是 C 初学者)
输出:
0 | Çc▬END
1 | -s▬END
2 | --▬END
3 | ---END
4 | ----END
5 | -----END
6 | ------END
7 | -------END
8 | --------P☺▬END
9 | ---------☺▬END
10 | ----------▬END
11 | -----------END
12 | ------------END
13 | -------------END
14 | --------------END
15 | ---------------END
16 | ----------------END
17 | -----------------END
18 | ------------------END
19 | -------------------END
每次运行程序时字符都不一样。
如果我使用 for 循环而不是 memset 来设置每个字符,结果将是相同的。
我听说 memset 可以解决问题,但我没有。
【问题讨论】:
-
请记住,C 中的字符串实际上称为 null-terminated 字符串。由于您的字符串中没有空终止符,所有寻找终止符的字符串函数都会超出范围,这会导致 未定义的行为。
-
打电话
malloc(0)时也要小心。如果返回NULL或有效指针(不能被取消引用!),则定义它的实现。 -
当然,每次循环迭代都会发生内存泄漏,因为您从未调用过
free。
标签: c memory char c-strings memset