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 };