gpt4 book ai didi

C - 重新分配错误 : corrupted size vs prev_size

转载 作者:太空宇宙 更新时间:2023-11-04 07:58:50 26 4
gpt4 key购买 nike

有人可以解释错误吗?
我一直收到错误,直到我一时兴起,将行从:

char *tmp = realloc(str, sizeof(char)*length);
// to added 1
char *tmp = realloc(str, sizeof(char) * length + 1);

我认为将sizeof(char)乘以长度会重新分配size=sizeof(char)*length的新内存区域。我不明白为什么加 1 可以解决问题。

    void edit_print(char *inputStr, size_t space_size) {
size_t ch_position = 0;
size_t space_column_count = 0;
size_t num_spaces_left = 0;
while ((inputStr[ch_position] != '\0')) {
if ((inputStr[ch_position] == '\t') && (space_size !=0)) {
num_spaces_left = (space_size-(space_column_count % space_size));
if (ch_position == 0 || !(num_spaces_left)) {
for (size_t i=1; i <= space_size; i++) {
putchar(' ');
space_column_count++;
}
ch_position++;
} else {
for (size_t i=1; i <= num_spaces_left; i++) {
putchar(' ');
space_column_count++;
}
ch_position++;
}
} else {
putchar(inputStr[ch_position++]);
space_column_count++;
}
}
printf("\n");
}

int main(int argc, char *argv[]) {
size_t space_size_arg = 3;
int inputch;
size_t length = 0;
size_t size = 10;
char *str = realloc(NULL, sizeof(char) * size);
printf("Enter stuff\n");

while ((inputch = getchar()) != EOF) {
if (inputch == '\n') {
str[length++] = '\0';

//changed line below
char *tmp = realloc(str, sizeof(char) * length + 1);

if (tmp == NULL) {
exit(0);
} else {
str = tmp;
}
edit_print(str, space_size_arg);
length = 0;
} else {
str[length++] = inputch;
if (length == size) {
char *tmp = realloc(str, sizeof(char) * (size += 20));
if (tmp == NULL) {
exit(0);
} else {
str = tmp;
}
}
}
}
free(str);
return 0;
}

编辑:我最初收到的错误消息是这篇文章标题中的错误消息。进行 chux 建议的更改后,错误是“realloc(): invalid next size: *hexnumber**”

最佳答案

input == '\n' 时,

size 需要更新。

char *tmp = realloc(str, sizeof(char) * length + 1/* or no +1 */); 可以缩小分配。这使得后面的 if (length == size) 无效(真正的分配大小更小),因此 str[length++] = inputch; 失去了内存访问保护。更新 size 以修复该孔。

+1 不需要 - 它只是隐藏了问题,因为 + 1 并没有减少分配。

  char *tmp = realloc(str, sizeof(char) * length);
if (tmp == NULL) {
exit(0);
} else {
str = tmp;
}
size = length; // add

关于 sizeof(char)* 代码。按目标类型的大小缩放的想法很好,但对于 char 来说并不重要,因为它总是 1。@Lee Daniel Crocker

如果代码想反射(reflect)目标的类型可能改变,不要使用size(the_type),使用sizeof(*the_pointer)。更易于编码、审查和维护。

// Don't even need to code the type `str` points to
tmp = realloc(str, sizeof *str * length);

关于C - 重新分配错误 : corrupted size vs prev_size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48177778/

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