gpt4 book ai didi

C - 动态内存分配 - 复制字符串

转载 作者:行者123 更新时间:2023-11-30 14:41:21 28 4
gpt4 key购买 nike

对于以下程序

#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 部分,因为如果我将 size int 设置为高,则一切正常。

有人可以告诉我如何正确执行此重新分配操作吗?

感谢您的支持

最佳答案

realloc返回不同的指针时,您不需要复制数据——这已经为您完成了。事实上,这是一个错误,因为您正在从不再存在的源复制数据,并且复制的数据量是原来的两倍!所以你只需要

data = data_new;

这行也是错误的

data[len] = '0';

应该是

data[len] = '\0';

并且还可以超出内存范围进行写入。您应该在写入终止符之前再次检查大小,或者更简单地,在使用 size-1 时重新分配内存,因为您知道您将需要额外的字节。

if(len == size - 1) {
// . . .
}

另请注意,如果您输入的字符均由换行符分隔,则 getchar() 也会读取每个换行符。

关于C - 动态内存分配 - 复制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55009428/

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