好的,这是一个关于C编程作业的问题。但我真的被卡住了。
我要求用户输入单词,然后将输入插入到数组中,但我无法控制用户输入的单词数量。
我想问的是如何在C中声明一个数组,而不声明它的长度,也不询问用户应该设置什么长度。
我知道这与malloc有关,但如果您能给我一些如何做到这一点的示例,我会非常感激。
malloc
申请一块足够大的内存来存储特定数量的数组项。realloc
来扩展内存块大小。#include <stdio.h>
#include <stdlib.h>
int main (void) {
int *xyzzy = NULL; // Initially NULL so first realloc is a malloc.
int currsz = 0; // Current capacity.
int i;
// Add ten integers.
for (i = 0; i < 10; i++) {
// If this one will exceed capacity.
if (i >= currsz) {
// Increase capacity by four and re-allocate.
currsz += 4;
xyzzy = realloc (xyzzy, sizeof(int) * currsz);
// Should really check for failure here.
}
// Store number.
xyzzy[i] = 100 + i;
}
// Output capacity and values.
printf ("CurrSz = %d, values =", currsz);
for (i = 0; i < 10; i++) {
printf (" %d", xyzzy[i]);
}
printf ("\n");
return 0;
}
currsz = 4
开始,然后每次重新分配时将 currsz
加倍,这将给您带来摊销常数时间,而不是线性时间。 - Danielrealloc
:-) - paxdiabloO(1)
而不是O(log n)
。 - Danielint size = 0;
char **array = malloc(0);
while(/* something */)
{
char *string = // get input
size++;
array = realloc(array, size * sizeof(char*));
array[size - 1] = string;
}
malloc(0)
是浪费时间的 - 行为在实现中被定义,要么分配一个您无法使用的块,要么返回NULL(参见C99 7.20.3)。 相比之下,直接将其设置为NULL更好,这可以被realloc
使用并且可以节省函数调用。 - paxdiablo是的,你需要使用malloc。看看这个教程。
http://www.cprogramming.com/tutorial/dynamic_memory_allocation.html
这个网站总体上很适合学习。
下面是使用realloc的示例,基本上就是你要做的事情。
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/
0) 显然你需要多个缓冲区,因此你需要一个类似列表的结构:可能是一个记录,包含100个字符的char数组和指向下一个结构的指针。 1) 你需要逐个字符捕获单词并将它们存储在你的缓冲区中。 2) 一旦缓冲区已满,你就会分配另一个记录,将其链接到前一个记录,并继续进行,直到你没有内存或进程结束。
这应该比realloc函数更好的性能。我相信malloc试图给出连续的内存块。因此,类似列表的结构将更快,效果更好。