有人可以解释一下这个错误吗? 我得到了这个错误,直到我一时兴起改变了这一行:
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():下一个大小无效:* hexnumber **”
答案 0 :(得分:2)
size
时需要更新 inputch == '\n'
。
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
如果代码想要反映目标类型可能会发生变化,请不要使用size(the_type)
,请使用sizeof(*the_pointer)
。更容易编码,审查和维护。
// Don't even need to code the type `str` points to
tmp = realloc(str, sizeof *str * length);