#include<stdio.h>
------------------
#include<stdlib.h>
--------------------
#include<string.h
--------------------
enum { buf = BUFSIZ };
char line[buf], **tab = NULL;
int cur_buf, count_lineMax = -1, count_line = -1,
i, j, k, l;
int main (int argc, char **argv) {
FILE *file1;
file1 = fopen(argv[1], "r");
cur_buf = buf;
/*printf("%d\n", cur_buf);*/
while(fgets(line, cur_buf, file1) != NULL) {
i = strlen(line);
for(j=0;j<i;j++) {
if(line[j] == '\n') {
count_lineMax++;
}
/*printf("%c", line[j]);*/
}
}
/*printf("%d\n", count_lineMax);*/
rewind(file1);
tab = malloc(count_lineMax);
memset(tab, 0, count_lineMax);
for(k=0;k<count_lineMax;k++) {
tab[k] = malloc(cur_buf+1);
memset(tab[k], 0, cur_buf+1);
}
while(fgets(line, cur_buf, file1) != NULL) {
i = strlen(line);
for(j=0;j<i;j++) {
if(line[j] == '\n') {
count_line++;
}
}
tab[count_line] = line;
printf("%s", tab[count_line]);
}
return 0;
for(l=0;l<count_lineMax;l++) {
free(tab[l]);
}
free(tab);
fclose(file1);
}
## Heading ##
答案 0 :(得分:1)
您没有为线路分配足够的内存。
char **tab;
tab = malloc(count_lineMax);
memset(tab, 0, count_lineMax);
count_lineMax
是文件中的行数,您尝试分配内存来存储多行。您只分配count_lineMax
字节的内存,但这对count_lineMax
指针来说还不够。这些行应为:
tab = malloc(count_lineMax * sizeof(*tab));
memset(tab, 0, count_lineMax * sizeof(*tab));
之后,您尝试分配更多内存来存储count_lineMax
指针,并且溢出内存会破坏堆。
此外,第二次读入文件时,您正在写入file
缓冲区并将该缓冲区存储在tab
数组中。你正在泄漏先前分配的内存,并试图free()
这个错误的缓冲区。因此,任何这些问题都会导致分段错误。
while(fgets(line, cur_buf, file1) != NULL) { /* read into `line` */
/* ... */
tab[count_line] = line; /* DEATH! */
}
/* ... */
for(l = 0; l < count_lineMax; l++) {
free(tab[l]); /* DOUBLE DEATH! *?
}
您需要正确地将行读取到已分配的缓冲区中:
count_line = 0;
while(fgets(&tab[count_line], cur_buf, file1) != NULL) { /* read into `line` */
/* ... */
count_line++;
}
或将<{1}}缓冲区的内容复制到您分配的缓冲区中。这样你就不会泄露你的记忆并释放错误的记忆。
line
代码还有其他问题,但我不会重复这些问题,因为它们具有更高的优先级。
答案 1 :(得分:0)
此外,您永远不会检查count_line是否在范围内,因此当您分配给它时,tab [count_line]可能无效。