假设我想"重用"一个字符指针数组,就像下面的程序中那样,循环参数列表中给定的文件,循环文件中的行,将它们添加到动态分配的数组中,然后打印它:
// includes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// globals
int progReturn = 0;
int globalLineCounter = 0;
////// main
int main(int argc, char *argv[]) {
FILE *fp;
int i;
// iterate files. first arg is the program name
for (i = 1; i < argc; i++) {
fp = fopen(argv[i], "r");
if (fp == NULL) {
fprintf(stderr, "The file '%s' did not exist.n", argv[i]);
progReturn = 1;
} else {
// read lines from the file
char line[256];
// THE PROBLEM: I'd like to completely clear this array.
char **lines = malloc(16 * sizeof(char*));
// iterate lines
int fileLineCounter = 0;
while (fgets(line, sizeof(line), fp)) {
// remove newline
strtok(line, "n");
// add lines to array
lines[globalLineCounter] = malloc(256 * sizeof(char));
strcpy(lines[globalLineCounter], line);
//printf("%sn", lines[globalLineCounter]); // tester
fileLineCounter++;
globalLineCounter++;
}
// all lines read
printf("The file '%s' had %d lines.n", argv[i], fileLineCounter);
// print the array
int j=0;
for (j=0; j<fileLineCounter; j++) {
// PROBLEM: Garbage from the second file when it prints here.
printf("%sn", lines[j]);
}
// delete lines, delete file
memset(lines, 0, sizeof(*lines));
fclose(fp);
}
}
// all files read
return progReturn;
}
在第一个文件中,所有操作都没有问题。在第二个文件中,当我打印数组时,它会显示不可打印的字符,以及第一个文件中的一些行。
是什么原因导致了这个问题?我是否未完全清除**lines
?
EDIT:示例输入和输出:
输入文件foo:
This is a test
of the lineSort program
in order to
test its capabilities.
Lots of whitespace too!
aaa
bbb
cccccc
aaa
ggggg
hhhhh
fffff
eeeee
ddddd
ppppp
输入文件栏:
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
zzzzzzzzzzzzzzzzz
ccccccccccccccccc
yyyyyyyyyyyyyyyyy
sortLine foo bar
:的输出
The file 'foo' had 20 lines.
cccccc
Lots of whitespace too!
This is a test
aaa
aaa
bbb
ddddd
eeeee
fffff
ggggg
hhhhh
in order to
of the lineSort program
ppppp
test its capabilities.
The file 'bar' had 5 lines.
(x▒▒
(x▒▒
Lots of whitespace too!
in order to
test its capabilities.
strcpy(lines[globalLineCounter], line);
这看起来是你的主要问题。globalLineCounter
在所有输入文件中不断增加。
假设您的第一个输入文件包含10行,第二个文件包含5行。然后,您的代码将创建一个(动态数组的(动态数组,并将第一个文件中的行存储在元素0
中。。9
(然后打印(。您永远不会释放任何分配的内存,所以它在循环结束时全部泄漏。
对于第二个文件,将创建另一个动态数组。将第二个文件中的5行存储在元素10
中。。14
(通过globalLineCounter
(,但随后打印元素0
。。4
(fileLineCounter
(。这些元素未初始化并且包含垃圾。
- 将
char **lines
初始化移到for
循环之外 - 将索引计数器
i
重命名为其他名称 - 在多个文件上重复调用
lines[i] = malloc(...)
会导致内存泄漏。考虑在for
循环中使用free
,或者将初始化的这一部分移到for
循环之外