Сколько памяти мне нужно выделить для массива X строк из 50 символов? - PullRequest
1 голос
/ 12 сентября 2011

Мне нужно создать массив строк для программы в одном из моих классов CS. Мы просто должны предположить, что длина всех строк не более 50 (это соответствует нулевому символу).

Мне нужно использовать malloc() или calloc(), чтобы выделить необходимый объем памяти для массива, но я новичок в C и не знаю, как использовать эти функции.

Реальный вопрос, который я предполагаю, состоит в том, сколько памяти мне нужно выделить для массива x строк из 50 символов.

Ответы [ 3 ]

3 голосов
/ 12 сентября 2011

Предполагая тип char, как минимум вам потребуется X * sizeof(char) * 50.

Если вы выполняете все эти выделения отдельно, для каждого выделения будут накладные расходы.Так что общий объем памяти в этом случае будет выше.

Эти накладные расходы не определены и могут быть довольно большими.

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

2 голосов
/ 12 сентября 2011

\0 называется символом завершения для строк.

Вам нужен массив указателей на символы.

char *strArrayPtr[X]; // X needs to be a compile time constant.
                      // C99 supports variable length arrays too.

Теперь каждый индекс содержит указатель на массив, который выделен malloc(50);

Пример:

#include <stdlib.h>
#include <stdio.h>

int main() {

    char *ar[2] ;
    ar[0] = "Hello";  // This needs to malloced memory in your case
    ar[1] = "World!"; // i.e., ar[0] = malloc(50);

    printf("%s", ar[0]);
    return 0;
}
0 голосов
/ 12 сентября 2011

Если вы хотите создать массив строк фиксированного размера с переменным размером:

char **arr = calloc(len, 50 * sizeof(char));

Не забудьте освободить память!

for(unsigned long i = 0; i < len; ++i)
    free(*arr++);

Вы не собираетесь динамически выдвигать элементы? Если так, то нам придется немного усложниться. (Я бы добавил StringArray::capacity, чтобы ускорить push, но я не хочу слишком усложнять вещи ... Видя, как я сосу у C, если вы посмотрите на комментарии ниже.;))

struct StringArray
{
    char** arr;
    unsigned long len = 0;
};

StringArray StringArray_init(char** arr = NULL, unsigned long len = NULL)
{
    StringArray a;
    a.arr = arr;
    a.len = len;
    return(a);
}

void StringArray_push(StringArray *a, char* str)
{
    if(len == 0)
    {
        a.arr = StringArrayInit(malloc(sizeof(char*)), 1);
    }
    else
    {
        a.len++;
    }

    a.arr = realloc(a.arr, a.len * sizeof(char*));
    a.arr[a.len - 1] = malloc((strlen(str) + 1) * sizeof(char));
    strcpy(a.arr[a.len - 1], str);
}

void StringArray_free(StringArray a)
{
    for(unsigned long i = 0; i < a.len; ++i)
        free(a.arr[i]);
}

StringArray szArr = StringArray_init();
StringArray_push(&szArr, "This is a string.");
StringArray_free(szArr);

С C ++ это намного проще. :)

std::vector<std::string> arr;
arr.push_back("This is a string."); 
...