gpt4 book ai didi

c - 将行读入动态分配的字符指针数组时出现段错误

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

在 C 中,我试图实现一个使用 getline() 读取文件中所有行的函数。它的实现与 getline() 类似,特别是它使用 realloc() 来调整 char** 的大小(如果没有)分配了足够的内存来存储指向一行的下一个指针。不幸的是,我在字符串重复过程中遇到了段错误。

经过一番探索后,我发现在尝试将第二行存储在 char 指针数组中时,第二次迭代期间发生了段错误。

ssize_t fgetlines(char*** linesptr, size_t* n, FILE* fp)
{
char* line = NULL;
size_t sz_line = 0;
size_t cur_len = 0;
size_t needed;

if (linesptr == NULL || n == NULL) {
errno = EINVAL;
return -1;
}

if (*linesptr == NULL) {
if (*n == 0)
*n = sizeof(**linesptr) * 30; /* assume 30 lines */
*linesptr = malloc(*n);
if (*linesptr == NULL) {
*n = 0;
return -1;
}
}

while (getline(&line, &sz_line, fp) > 0) {
needed = (cur_len + 1) * sizeof(**linesptr);
while (needed > *n) {
char** new_linesptr;
*n *= 2;
new_linesptr = realloc(*linesptr, *n);
if (new_linesptr == NULL) {
*n /= 2;
free(line);
return -1;
}
*linesptr = new_linesptr;
}
*linesptr[cur_len] = strdup(line);
printf("%s", *linesptr[cur_len]);
if (*linesptr[cur_len] == NULL) {
free(line);
free(*linesptr);
return -1;
}
++cur_len;
}

free(line);
return cur_len;
}

我这样调用该函数:

    char **settings = NULL;
size_t sz_settings = sizeof(*settings) * 6;
int count = fgetlines(&settings, &sz_settings, f_cfg);

由于该函数无法成功完成,我没有得到任何输出。但是在 strdup() 之后打印回字符串后,我设法在段错误之前得到一行 f_cfg, "Hello World"

最佳答案

应该改变

*linesptr[cur_len]  =>  (*linesptr)[cur_len]

修改后的函数如下:

ssize_t fgetlines(char *** linesptr, size_t *n, FILE *fp)
{
char *line = NULL;
size_t sz_line = 0;
size_t cur_len = 0;
size_t needed;

if (linesptr == NULL || n == NULL) {
errno = EINVAL;
return -1;
}

if (*linesptr == NULL) {
if (*n == 0)
*n = sizeof(**linesptr) * 30; /* assume 30 lines */
*linesptr = malloc(*n);
if (*linesptr == NULL) {
*n = 0;
return -1;
}
}

while (getline(&line, &sz_line, fp) > 0) {
needed = (cur_len + 1) * sizeof(**linesptr);
while (needed > *n) {
char **new_linesptr;
*n *= 2;
new_linesptr = realloc(*linesptr, *n);
if (new_linesptr == NULL) {
*n /= 2;
free(line);
return -1; // Possible memory leak
}
*linesptr = new_linesptr;
}
(*linesptr)[cur_len] = strdup(line);
printf("%s", (*linesptr)[cur_len]);
if ((*linesptr)[cur_len] == NULL) {
free(line);
free(*linesptr);
return -1; // Possible memory leak
}
++cur_len;
}

free(line);
return cur_len;
}

另外,当你的内存分配失败时,“strdup”的内存没有空闲,这会导致内存泄漏。

关于c - 将行读入动态分配的字符指针数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54757394/

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