【发布时间】:2019-03-05 18:37:07
【问题描述】:
用于以下程序
#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 部分,因为如果我将大小 int 设置为高,则一切正常。
有人对我有什么建议吗?如何正确地执行 realloc 操作?
感谢您的支持
【问题讨论】:
-
错误是什么?
-
不需要
memcpy部分,因为realloc正在为您复制数据。data在realloc之后变为(可能变为)无效。 -
data[len] = '0';这不是 NUL 终止符。 -
如果您的数据长度为 16 或 32 或 64 个字符,
data[len]将是主循环后有效内存后的一个字符。 -
如果您的输入正好是 16(或 32,或 64,...)字节,您将尝试在分配区域之外写入。
标签: c dynamic-memory-allocation memcpy realloc