在malloc'ing上获取字符串数组的seg错误。请帮忙

时间:2011-08-18 11:06:56

标签: c

#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 ##

2 个答案:

答案 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]可能无效。