getline() 内存重新分配失败
getline() memory reallocation fails
使用 FILE * some_file("somefile.txt", "r")
成功打开文件后,我正在使用 getline()
读取一行。
我可以提供 getline()
足够的缓冲区 char * line = malloc((size_t) 1024);
,效果很好。我还可以提供比所需更少的缓冲区 - char * line = malloc((sizeof(char)))
或 NULL
-指针 char * line = NULL;
,并且正如预期的那样,getline()
是 allocating/reallocating 并修改 line
.
char * line = malloc((sizeof(char)))
size_t n;
n = getline(&line, &n, some_file);
但是如果我在没有定义一些值或缓冲区的情况下声明一个指针,我会得到错误 not enough space (系统没有崩溃!)。
char * line ;
size_t n;
n = getline(&line, &n, some_file); // Error: Not enough space
提供特定缓冲区 char * line = malloc(sizeof(char)))
和 [=23] 之间的区别在哪里 - 这应该是一个指向字符的指针(我知道我被允许使用这个内存,因为 malloc()
) =] - 这也应该是一个指向 char 的指针(当然我不知道我是否允许使用这个内存,但是程序没有崩溃)?
问题是缺少变量的初始化,这导致了 getline
不期望的值。如果单元化,具有 自动存储持续时间的变量具有不确定的值 。使用这些值将导致未定义的行为。
初始化 line
的正确方法是将其设置为 NULL
并让 getline
执行看起来合适的 malloc,
或如果你已经分配了一些你坚持要在这里再次使用的内存,那么n
需要设置为内存分配的大小。 IE。或者:
char * line = malloc(1);
size_t n = 1;
ssize_t rv = getline(&line, &n, some_file);
或
char * line = NULL
size_t n; // or can explicitly initialize this to `= 0` but it shouldn't matter
ssize_t rv = getline(&line, &n, some_file);
因此,您问题中的两个 摘录完全错误。
最后,return 值是 ssize_t
类型,它 与 n
无关,只是在 return 的值 严格小于 存储在 n
中的值。你不能把它存储在同一个变量中!
要使用 getline
处理某些文件中的 每一 行,无需调用 malloc
- 只需让 getline
处理内存分配:
char * line = NULL;
size_t n = 0;
while (1) {
errno = 0;
ssize_t rv = getline(&line, &n, some_file);
if (rv < 0) {
if (feof(some_file)) {
fprintf(stderr, "end of file, no problemo.");
}
else if (ferror(some_file)) {
perror("an error occurred while reading from the file");
}
else {
perror("some other error occurred");
}
free(line);
break;
}
// at this point `line` points to an array
// of `rv` characters, with possible embedded nulls,
// meaning one line of data from the file,
// + the terminating null character
//
// `n` is the *total number* of allocated bytes in the
// allocation pointed to by `line`.
printf("I got a line of input: ");
fwrite(line, 1, rv, stdout);
}
使用 FILE * some_file("somefile.txt", "r")
成功打开文件后,我正在使用 getline()
读取一行。
我可以提供 getline()
足够的缓冲区 char * line = malloc((size_t) 1024);
,效果很好。我还可以提供比所需更少的缓冲区 - char * line = malloc((sizeof(char)))
或 NULL
-指针 char * line = NULL;
,并且正如预期的那样,getline()
是 allocating/reallocating 并修改 line
.
char * line = malloc((sizeof(char)))
size_t n;
n = getline(&line, &n, some_file);
但是如果我在没有定义一些值或缓冲区的情况下声明一个指针,我会得到错误 not enough space (系统没有崩溃!)。
char * line ;
size_t n;
n = getline(&line, &n, some_file); // Error: Not enough space
提供特定缓冲区 char * line = malloc(sizeof(char)))
和 [=23] 之间的区别在哪里 - 这应该是一个指向字符的指针(我知道我被允许使用这个内存,因为 malloc()
) =] - 这也应该是一个指向 char 的指针(当然我不知道我是否允许使用这个内存,但是程序没有崩溃)?
问题是缺少变量的初始化,这导致了 getline
不期望的值。如果单元化,具有 自动存储持续时间的变量具有不确定的值 。使用这些值将导致未定义的行为。
初始化 line
的正确方法是将其设置为 NULL
并让 getline
执行看起来合适的 malloc,
或如果你已经分配了一些你坚持要在这里再次使用的内存,那么n
需要设置为内存分配的大小。 IE。或者:
char * line = malloc(1);
size_t n = 1;
ssize_t rv = getline(&line, &n, some_file);
或
char * line = NULL
size_t n; // or can explicitly initialize this to `= 0` but it shouldn't matter
ssize_t rv = getline(&line, &n, some_file);
因此,您问题中的两个 摘录完全错误。
最后,return 值是 ssize_t
类型,它 与 n
无关,只是在 return 的值 严格小于 存储在 n
中的值。你不能把它存储在同一个变量中!
要使用 getline
处理某些文件中的 每一 行,无需调用 malloc
- 只需让 getline
处理内存分配:
char * line = NULL;
size_t n = 0;
while (1) {
errno = 0;
ssize_t rv = getline(&line, &n, some_file);
if (rv < 0) {
if (feof(some_file)) {
fprintf(stderr, "end of file, no problemo.");
}
else if (ferror(some_file)) {
perror("an error occurred while reading from the file");
}
else {
perror("some other error occurred");
}
free(line);
break;
}
// at this point `line` points to an array
// of `rv` characters, with possible embedded nulls,
// meaning one line of data from the file,
// + the terminating null character
//
// `n` is the *total number* of allocated bytes in the
// allocation pointed to by `line`.
printf("I got a line of input: ");
fwrite(line, 1, rv, stdout);
}