malloc和x27上的seg故障;正在对字符串数组进行初始化。如何摆脱它?我可以发现,当分配到第二维度时,它会精确地发生 #包括 #包括 #包括 枚举{buf=BUFSIZ}; 字符行[buf],**制表符=NULL; 整数cur\u buf,count\u line max=-1,count\u line=-1, k、 l; int main(int argc,字符**argv){ 文件*file1; file1=fopen(argv[1],“r”); cur_buf=buf; /*printf(“%d\n”,cur_buf)*/ while(fgets(line,cur_buf,file1)!=NULL){ count_lineMax++; /*printf(“%c”,第[j]行)*/ } /*printf(“%d\n”,count\u lineMax)*/ 倒带(文件1); tab=malloc(count_lineMax*sizeof(*tab)); memset(tab,0,count_lineMax*sizeof(*tab)); /*printf(“%d%ld%ld\n”、count\u lineMax、sizeof(*tab)、count\u lineMax*sizeof(*tab))*/ if(tab==NULL){ printf(“Mem_check\n”); 返回退出失败; } 对于(k=0;k

malloc和x27上的seg故障;正在对字符串数组进行初始化。如何摆脱它?我可以发现,当分配到第二维度时,它会精确地发生 #包括 #包括 #包括 枚举{buf=BUFSIZ}; 字符行[buf],**制表符=NULL; 整数cur\u buf,count\u line max=-1,count\u line=-1, k、 l; int main(int argc,字符**argv){ 文件*file1; file1=fopen(argv[1],“r”); cur_buf=buf; /*printf(“%d\n”,cur_buf)*/ while(fgets(line,cur_buf,file1)!=NULL){ count_lineMax++; /*printf(“%c”,第[j]行)*/ } /*printf(“%d\n”,count\u lineMax)*/ 倒带(文件1); tab=malloc(count_lineMax*sizeof(*tab)); memset(tab,0,count_lineMax*sizeof(*tab)); /*printf(“%d%ld%ld\n”、count\u lineMax、sizeof(*tab)、count\u lineMax*sizeof(*tab))*/ if(tab==NULL){ printf(“Mem_check\n”); 返回退出失败; } 对于(k=0;k,c,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, k, l; int main (int argc, char **argv) { FILE *fil

这看起来有点可疑:

#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,
    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) {
            count_lineMax++;
            /*printf("%c", line[j]);*/
    }
    /*printf("%d\n", count_lineMax);*/

    rewind(file1);

    tab = malloc(count_lineMax * sizeof(*tab));
    memset(tab, 0, count_lineMax * sizeof(*tab));

    /*printf("%d %ld %ld\n", count_lineMax, sizeof(*tab), count_lineMax * sizeof(*tab));*/

    if(tab == NULL) {
            printf("Mem_check\n");
            return EXIT_FAILURE;
    }

    for(k=0;k<=count_lineMax;k++) {
            tab[k] = malloc(cur_buf+1);
            memset(tab[k], 0, cur_buf+1);

            if(tab[k] == NULL) {
                    printf("Mem_check*\n");
                    return EXIT_FAILURE;
            }
    }

    printf("%d %ld %ld\n", cur_buf, sizeof(tab), cur_buf * sizeof(*tab));

    while(fgets(line, cur_buf, file1) != NULL) {

            count_line++;

            strcpy(tab[count_line], line);
            printf("%s", tab[count_line]);
    }
    for(l=0;l<count_lineMax;l++) {
            free(tab[l]);
    }
    free(tab);
    return 0;
    fclose(file1);
}

在初始化选项卡之前,您正在解除对它的引用。

错误1:验证输入失败(潜在segfault)

更改此项:

tab = malloc(count_lineMax * sizeof(*tab));
为此:

file1 = fopen(argv[1], "r");
错误2:关闭一个索引错误(潜在segfault)

然后,按如下方式初始化变量:

if (argc != 2) {
    fputs("Usage: PROGNAME FILE\n", stderr);
    exit(1);
}
file1 = fopen(argv[1], "r");
否则,您的计数将太小。我不知道您从何处获得了
-1
,但如果您有一个空文件,它应该有0行,对吗?(尝试向其输入一个空文件。它将崩溃。)

然后,将
count\u line++
移动到循环的底部:

count_lineMax = 0; // -1 is incorrect
count_line = 0; // -1 is incorrect

另外,改变循环条件
kchanging,这不起作用。你能解释一下吗?@gyan你改变了什么?你需要更精确地在这里得到有用的答案,而不是被忽略。你可以从编辑你的问题开始,反映你正在尝试做的事情,并给出一个最小的可编译的例子。你做了什么将其更改为?…请解释。在执行该行之前,tab不会指向任何您可以依赖的内容。通常情况下,seg错误是指当您的地址指向非您的段时,分段冲突。该选项卡跟随指向该位置的指针。由于您没有将tab设置为该行之前的任何内容*,因此它指向某个这是假的,运行时正在破坏你:抛出一个seg错误。对不起,这是一个错误。@克里斯:这是我将tab=malloc(count\u lineMax*sizeof(*tab));更改为*tab=malloc(count\u lineMax*sizeof(*tab));但我确实将其初始化为NULL,如“char**tab=NULL”中所示realloc?对于一个更大的连续块的可用性来说,这不是很令人沮丧吗?这是一个很大的帮助。我应该学会引入尽可能多的检查。我开始使用malloc/realloc,但后来改为提前估计总内存和malloc。不过,我的问题还没有解决。@gyan:不要想太多关于取悦分配程序,除非你真的知道它是如何工作的。使用
realloc
很好。@gyan:同样改变
k感谢你的帮助。我也会和Valgrind核实一下。我做了这个:k
while(fgets(line, cur_buf, file1) != NULL) {
        strcpy(tab[count_line], line);
        printf("%s", tab[count_line]);
        count_line++;
}
if (tab == NULL) {
if (tab == NULL && count_lineMax) {
enum { buf = BUFSIZ };
enum { BUFFER_SIZE = 1024 * 8 };
enum { MAX_LINE_LENGTH = 1024 * 8 };
// Or if that's too verbose,
enum { MAXLINELEN = 1024 * 8 };