用于以下程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int size = 16, len = 0, c;
char* data = (char*)malloc(sizeof(char) * size);
while((c = getchar()) != EOF) {
if(len == size) {
size *= 2;
char* data_new = (char*)realloc(data, sizeof(char) * size);
if(data_new == NULL) {
free(data);
return -1;
}
if(data_new != data) {
memcpy(data_new, data, size);
data = data_new;
}
}
data[len] = c;
len++;
}
data[len] = '0';
printf("%s\n", data);
free(data);
return 0;
}
我认为错误在于realloc部分,因为如果将im设置为int,则一切正常。
有人给我一个提示,我如何正确地重新分配呢?
谢谢您的支持
答案 0 :(得分:1)
当realloc
返回不同的指针时,您不需要复制数据-这已为您完成。实际上,这是一个错误,因为您是从不再存在的源中复制数据,而复制的数据量是它的两倍!所以你只需要
data = data_new;
这行也是错误的
data[len] = '0';
应该是
data[len] = '\0';
并且还可以写超出内存范围的内容。您应该在写入终止符之前再次检查大小,或者更简单地讲,在使用size-1
后重新分配内存,因为您知道需要额外的字节。
if(len == size - 1) {
// . . .
}
还请注意,如果您输入的每个字符之间都用换行符隔开,那么getchar()
也会读取每个换行符。