带有垃圾字符的动态分配内存
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 文件。
谢谢大家!
使用以下方法读取文件内容时:
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 文件。
谢谢大家!