我担心加载大量字符串的 C99 应用程序的内存占用。我有字符串长度的上限,我基本上做这样的事情(这个语句在循环中):
char* input = (char*)malloc(sizeof (char)* MAX_CHAR_INPUT_SIZE);
scanf_s("%s", input, MAX_CHAR_INPUT_SIZE);
如您所见,如果用户提供的字符串很小,则会浪费大量内存。我唯一的想法是在读取后将该字符串复制到大小合适的内存块,然后释放更大的内存块。这是好方法吗? (我知道这将是 O(N))。
也有人可以向我解释这是如何用高级语言解决的吗? (例如 C# 的 Console.Read())
最佳答案
如果你在循环中执行它,那么你可以在为最终字符串分配内存之前将其读入临时文件:
char input[MAX_CHAR_INPUT_SIZE];
scanf_s("%s", input, sizeof input);
size_t input_size = strlen(input) + 1;
char *input_final = malloc(input_size);
memcpy(input_final, input, input_size);
这样一来,每个字符串仍然只有一次调用 malloc()
,但每次都分配完全正确的大小。
关于c - 内存占用优化与性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389680/