在C中向字符串添加子字符串时重新分配内存的最佳方法

时间:2014-04-24 13:08:20

标签: c string realloc

我有:

char *data = malloc(file_size+1);

我也有char *string = "string1"之类的字符串。 我希望每当我要将另一个字符串添加到数据时,就能将内存重新分配给数据。在C中做这个的最好方法是什么,我已经看过其他方法,比如使用file_size * 2,但是,这会浪费内存,添加字符串长度时最好的方法是什么记忆。这适用于简单的桌面应用程序。

2 个答案:

答案 0 :(得分:2)

这非常取决于你想要优化的内容,而且这里很难回答,因为你没有多说“最佳”对你意味着什么,即约束是什么。

对于在桌面或服务器计算机上运行的通用程序,我从头开始过度分配,以避免必须调用realloc(),并且每次溢出时通常会将分配加倍。在需要之前,内存可能不会被(物理上)使用,所以为什么要尝试“保存”呢?

如果分配将是长期的(几天或几周),那么尝试更加保守可能是有意义的。如果连接数很少,则可能不会。等等。

答案 1 :(得分:0)

您可以使用realloc为现有动态分配的缓冲区分配更多内存。此外,您对字符串文字的指针应该是const限定的,因为它们是只读的。

const char *string = "string1"
char *data = malloc(strlen(string) + 1); // +1 for the null byte

strcpy(data, string)

const char *string2 = "hello";
char *temp = NULL;

// +1 for the terminating null byte
int newsize = strlen(data) + strlen(string2) + 1;

// realloc returns NULL in case it fails to reallocate memory.
// save the value of data in temp before calling reallocate
temp = data;
data = realloc(data, newsize);

// check for failure of realloc
if(data == NULL) {
    printf("realloc failed\n");
    data = temp;
    // handle it
}