gpt4 book ai didi

c - `realloc(): invalid next size` 尝试处理未知大小的输入

转载 作者:行者123 更新时间:2023-12-05 09:35:24 25 4
gpt4 key购买 nike

我有以下代码:如果 NULL 被传递,函数 get_unlimited_input 分配一个新字符串,否则它只是将字符附加到现有字符串。最后它会截断多余的字节。(DEFAULT_BUFFER_SIZE 设置为 5 以测试许多重新分配的用例)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define DEFAULT_BUFFER_SIZE 5

char *get_unlimited_input(char *buffer) {
size_t current_size;
if (buffer == NULL) {
buffer = malloc(DEFAULT_BUFFER_SIZE * sizeof(char));
current_size = DEFAULT_BUFFER_SIZE;
} else {
current_size = strlen(buffer) + DEFAULT_BUFFER_SIZE;
}
char *cursor = buffer + current_size - DEFAULT_BUFFER_SIZE;
for (;;) {
int current = getchar();
*cursor = (char)current;
cursor++;
if (current == '\n' || current == EOF)
break;
if (cursor >= buffer + current_size) {
current_size += DEFAULT_BUFFER_SIZE;
buffer = realloc(buffer, current_size);
cursor = buffer + current_size - DEFAULT_BUFFER_SIZE;
}
}
*cursor = '\0';
buffer = realloc(buffer, cursor - buffer);
return buffer;
}

int main() {
printf(">");
char *buffer = get_unlimited_input(NULL);
printf(">");
get_unlimited_input(buffer);
}

在大多数情况下,它工作得很好,但如果我先传递 117 个字符,然后传递 12 个字符,它就会崩溃:

>.....................................................................................................................
>............
realloc(): invalid next size
Aborted (core dumped)
python3 -c "print('.'*117+'\n'+'.'*12)" | ./_buffer
realloc(): invalid next size
Aborted (core dumped)

问题是什么?

最佳答案

除其他问题外,您在返回缓冲区之前从缓冲区中删除了所有额外空间。但是,如果您将缓冲区传递给该函数,您会认为它仍然有额外的空间。因此,您不能将函数返回的缓冲区传递回函数。但你正是这样做的。

    } else {
current_size = strlen(buffer) + DEFAULT_BUFFER_SIZE;
}
...
buffer = realloc(buffer, cursor - buffer);

此外,正如 KamilCuk 所指出的,您没有在返回的字符串中为终止符留出空间,因此对其调用 strlen 是不安全的。

您应该记录对函数输入的要求是什么,以及函数的输出保证满足什么要求。这使得发现此类错误变得更加容易。

一看到“如果给这个函数传递了一个buffer,它一定有额外的空间”和“这个函数返回的buffer没有任何额外的空间”,很明显你不能传递返回的buffer返回函数,因为输出保证不满足输入要求。

关于c - `realloc(): invalid next size` 尝试处理未知大小的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65891246/

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