使用 realloc 增加数组的大小
Using realloc to increase the size of an array
我正在尝试将一堆字符扫描到一个数组中。我已经使用 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 个字符时出现堆缓冲区溢出。
++a;
a = realloc(a, 2 * size);
这就是问题所在。 realloc
的第一个参数必须是 malloc
系列函数返回的指针,或者是空指针。 a
曾经是一个,但是到了++a;
,就不再是了。
你需要两个指点。一是缓冲区的位置。另一个是当前角色的位置。当它们之间的差异足够大时,重新分配缓冲区并重置指针。
删除 ++a 。就是这里的罪魁祸首。
realloc() 接受 NULL 指针或 malloc 返回的指针。
阅读手册页。
希望你明白。快乐编码..
我看到这里有两个问题。
首先是递增 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;
}
我正在尝试将一堆字符扫描到一个数组中。我已经使用 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 个字符时出现堆缓冲区溢出。
++a;
a = realloc(a, 2 * size);
这就是问题所在。 realloc
的第一个参数必须是 malloc
系列函数返回的指针,或者是空指针。 a
曾经是一个,但是到了++a;
,就不再是了。
你需要两个指点。一是缓冲区的位置。另一个是当前角色的位置。当它们之间的差异足够大时,重新分配缓冲区并重置指针。
删除 ++a 。就是这里的罪魁祸首。
realloc() 接受 NULL 指针或 malloc 返回的指针。
阅读手册页。
希望你明白。快乐编码..
我看到这里有两个问题。
首先是递增 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;
}