我正在编写一个简单的编译器,只是为了好玩,我希望每行都有适当的缩进。
所以我写了一个函数,它返回一个字符数组,根据数字有一些空格。
问题是,当数组生成时,在文件中写入或只是打印时,一些字符似乎是错误的。我认为它们是从包含一些信息的内存位置获取的,因为我看到了文件路径的片段。
我做了一个示例代码,有相同的问题
int num = 0;
char *tabs;
for (; num < 20; num++)
{
tabs = malloc(num);
memset(tabs, '-', num);
printf("%d | %sENDn", 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
每次运行程序,字符都不一样。
如果不是memset我使用for循环来设置每个字符,结果将是相同的。
我读到memset可以解决这个问题,但是我没有。
使用memset
后动态分配的字符数组制表符tabs = malloc(num);
memset(tabs, '-', num);
不包含字符串。
因此,在调用printf
时使用转换说明符%s
将调用未定义的行为。
你可以写
tabs = malloc(num + 1);
memset(tabs, '-', num);
tabs[num] = ' ';
另一种方法是将printf的调用更改为以下方式
printf("%d | %.*sENDn", num, num, tabs);
注意for循环会产生大量的内存泄漏,因为在循环的每次迭代中分配的内存没有被释放。