我正在尝试将一堆字符扫描成一个数组。我已经使用malloc来设置数组的原始大小,但是如果用户输入的字符多于初始大小允许的数量,我想使用realloc来增加大小。我不太确定在哪里放置realloc,或者它应该在条件语句中。
char *strscan(void) {
int size = sizeof(char) * 10;
char *a = malloc(size);
// Below I try to read character input from the user and store it in the array.
while (a != EOF) {
scanf("%c", a);
if (trace) printf("%c", *a);
++a;
a = realloc(a, 2 * size);
}
return a;
}
截至目前,我在输入时仍然会出现堆缓冲区溢出,例如,15个字符。
答案 0 :(得分:4)
++a;
a = realloc(a, 2 * size);
这就是问题所在。 realloc
的第一个参数必须是由malloc
族函数或空指针返回的指针。 a
曾经是{1},但++a;
已经不再存在了。
答案 1 :(得分:3)
我在这里看到两个问题。
首先是你递增a
,然后将递增的值传递给realloc
。由于传递给realloc
的指针不是从malloc
,calloc
或realloc
返回的值,或者是NULL,因此可能会导致错误。
第二个问题是,在第一次调用realloc
后,你没有增加内存缓冲区的大小,因为你总是传递它2 * size
而size
永远不会改变。所以你最终会跑过缓冲区的末尾。
您需要一个单独的指针来跟踪下一个字符应该去的位置,并且您需要跟踪当前缓冲区的大小以及realloc
仅当您的现有缓冲区几乎已满时。
char *strscan(void) {
size_t size = sizeof(char) * 10;
char *a = malloc(size);
char *current; // The current character
ptrdiff_t diff;
current = a;
do {
scanf("%c", current);
if (trace) printf("%c", *current);
if (current - a >= size - 1) {
size *= 2;
diff = current - a;
a = realloc(a, size);
current = a + diff; // Since "a" could change, we need to modify "current" as well
}
} while (*current++ != '\n');
*current = '\x0';
return a;
}
答案 2 :(得分:2)
删除++ a。这是罪魁祸首。
realloc()接受NULL指针或malloc返回的指针。
阅读手册页。
希望你理解。快乐的编码..
答案 3 :(得分:1)
你需要两个指针。一个是缓冲区的位置。另一个是当前角色的位置。当它们之间的差异足够大时,重新分配缓冲区并重置指针。