Как объявить массив с произвольным размером - PullRequest
3 голосов
/ 24 октября 2011

Хорошо, это вопрос домашней работы по программированию на C.Но я действительно застрял.

Я прошу пользователя ввести слова, а затем вставляю ввод в массив, но я не могу контролировать количество слов, которые вводит пользователь.

Я думаю, что я спрашиваю, как вы объявляете массив в C, не объявляя его длину и не спрашивая пользователя, какой должна быть длина.

Я знаю, что это как-то связано сmalloc, но если бы вы могли дать мне несколько примеров того, как это сделать, я был бы очень признателен.

Ответы [ 4 ]

3 голосов
/ 24 октября 2011

Вы можете 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;
}
2 голосов
/ 24 октября 2011

Вы можете перераспределять его каждый раз, как:

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

Или частями, если вам небезразлична скорость.

0 голосов
/ 24 октября 2011

0) очевидно, вам понадобится несколько буферов, поэтому вам понадобится список типа структуры: возможно, запись с массивом символов 100 символов и указатель на следующую структуру 1) Вам нужно захватить слова char по char и сохранить их в своем буфере 2) как только буфер заполнен, вы выделяете другую запись, связываете ее с предыдущей и продолжаете, пока у вас не закончится память или процесс не закончится.

Это должно быть лучше, чем функция realloc. Я полагаю, что malloc пытается дать консервативный блок памяти. Поэтому структура, подобная списку, будет быстрее и будет работать лучше.

0 голосов
/ 24 октября 2011

Да, вы хотите malloc.Оформить заказ.

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

Этот сайт в общем хорош для обученияделать.

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

...