我需要为50个字符的X字符串数组分配多少内存?

时间:2011-09-12 00:20:27

标签: c arrays string memory malloc

我需要为我的一个CS类中的程序创建一个字符串数组。我们假设所有字符串的长度不超过50(这说明了空字符)。

我需要使用malloc()calloc()为数组分配适当的内存量,但我是C的新手,我真的不知道如何使用这些函数。

我想真正的问题是我需要为50个字符的x个字符串数组分配多少内存。

3 个答案:

答案 0 :(得分:3)

假设输入char,您至少需要X * sizeof(char) * 50

如果您分别执行所有这些分配,则每次分配都会产生开销。所以这种情况下的总内存量会更高。

此开销未指定,可能相当大。

但是我不会为家庭作业而担心。我无法想象需要足够内存才能运行系统的问题。

答案 1 :(得分:2)

\0被称为字符串的终止字符。

你需要的是char指针数组。

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

答案 2 :(得分:0)

如果你想制作一个可变大小的固定大小字符串数组:

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.");