gpt4 book ai didi

c - 在字符串数组的 malloc 上出现段错误。请帮忙

转载 作者:行者123 更新时间:2023-11-30 21:26:44 25 4
gpt4 key购买 nike

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

最佳答案

您没有为您的线路分配足够的内存。

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

或者行缓冲区的内容复制到您分配的缓冲区中。这样你就不会泄漏内存并释放错误的内存。

count_line = 0;
while(fgets(line, cur_buf, file1) != NULL) { /* read into `line` */
/* ... */
strcpy(tab[count_line], line);
count_line++;
}

代码还存在其他问题,但我不会讨论它们,因为这些问题的优先级更高。

关于c - 在字符串数组的 malloc 上出现段错误。请帮忙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7106406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com