带有垃圾字符的动态分配内存

dynamically allocated memory with garbage characters

使用以下方法读取文件内容时:

struct stat st;
stat(argv[i], &st);
int size = st.st_size;

//allocate memory to the whole file size
buffer = malloc(size); 
while (fgets(buffer, size, theFile))
    { //print lines

我看到第一次迭代将一些 Unicode 字符选入我拥有的 char * 缓冲区(动态分配)。见下文:

电影内容:

(base) system1@sys% cat 1.txt 
asdas
asd
asd
a
as
das
da
sd
asd

使用 Clion。

Interesting enough these characters appear only for the first argument while invoking the function and not with any other argument.

For instance: ./code.c 1.txt 2.txt 3.txt

will only add some garbage characters infront of 1.txt right after first fgets() is being called.

我想不通是什么导致缓冲区出现这种情况。我也尝试过使用 memset 初始化。有什么指点吗?

您正在编码:

struct stat st;
stat(argv[i], &st);

但是stat(2)系统调用可能会失败!您的代码应该可以处理这种情况。

阅读有关 dynamic memory management 的 C.

buffer = malloc(size); 

请注意 malloc 可能会失败并且可能会 重用 之前的 free-d 内存。当malloc成功时,内存区可能包含垃圾数据。

所以你应该进行测试:

if (!buffer) { perror("malloc buffer"); exit(EXIT_FAILURE); }

然后清除缓冲区(在你的循环内!)

memset(buffer, 0, size);

另请参阅 fgets。它也可能会失败!

我的建议:在编译器中启用更多警告和调试信息。用 GCC compiler, compile using gcc -Wall -Wextra -g. Once you got no warnings from your compiler, use a debugger (like GDB) 来理解你的程序的行为。

您可能有兴趣在您的代码中使用 Clang static analyzer。 稍后使用 valgrind with the address sanitizer 来寻找内存泄漏。

学习一些free software, e.g. GNU bash or GNU make (or GNU libc, if on Linux; e.g. if your laptop runs Debian).

的源代码获得灵感

啊,菜鸟的错误!

FILE *theFile = open_the_file(argv[i+1]);

已修复。

我正在访问 argv[i],当索引为 0 时,它指的是 exe 文件。

谢谢大家!