如何声明具有任意大小的数组

时间:2011-10-24 03:37:31

标签: c arrays size malloc

好的,这是一个C编程的家庭作业问题。但我真的被卡住了。

我要求用户输入单词,然后将输入插入数组,但我无法控制用户输入的单词数。

我想我要问的是如何在C中声明一个数组而不声明其长度而不询问用户应该是多长。

我知道这与malloc有关,但如果你能给我一些如何做的例子,我真的很感激。

4 个答案:

答案 0 :(得分:3)

你可以malloc一块足够大的内存块来容纳一定数量的数组项。

然后,在超过该数字之前,您可以使用realloc使内存块更大。

这里有一些C代码显示了这一点,只要它太小而无法容纳下一个整数,就会重新分配一个整数数组。

#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;
}

答案 1 :(得分:2)

您可以每次重新分配:

int size = 0;
char **array = malloc(0);
while(/* something */)
{
    char *string = // get input
    size++;
    array = realloc(array, size * sizeof(char*));
    array[size - 1] = string;
}

如果你关心速度的话,还是大块的。

答案 2 :(得分:0)

是的,你想要malloc。看看这个啧啧。

http://www.cprogramming.com/tutorial/dynamic_memory_allocation.html

这个网站一般都适合学习。

以下是使用realloc的示例,它基本上就是您要求做的事情。

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

答案 3 :(得分:-1)

0)显然你需要多个缓冲区,所以你需要一个像结构这样的列表:也许是一个带有char数组100个字符的记录和一个指向下一个结构的指针 1)您需要通过char捕获单词char并将它们存储在缓冲区中 2)一旦缓冲区已满,你就会分配另一条记录,将它与上一条记录链接起来并继续运行,直到你没有记忆或流程结束。

这应该是比realloc功能更好的性能。我相信malloc正试图给出连续的内存块。因此,类似结构的列表会更快,效果更好。