【问题标题】:How much memory do I need to allocate for an array of X strings of 50 characters?我需要为 50 个字符的 X 字符串数组分配多少内存?
【发布时间】:2011-09-12 00:20:26
【问题描述】:

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

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

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

【问题讨论】:

  • \0 是空终止符或空字符

标签: c arrays string memory malloc


【解决方案1】:

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

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

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

但对于家庭作业,我不会担心这一点。我无法想象需要足够的内存来运行系统的问题。

【讨论】:

  • 如果你说的是终止 NULL,OP 说它已经包含在 50 中了。
  • sizeof(char) == 1(C 标准的要求,如果我没记错的话)
【解决方案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;
}

【讨论】:

  • 我的 X 将会改变。它是什么,是来自三个不同文件的单词数。我需要将每个文件中的所有单词合并到一个二维数组中,然后对其进行排序以输出到一个新文件。
  • @Michael - 有了给定的想法,首先开始锻炼。当你被击中时,SO会帮助你:)
  • 好吧,我想我真的不知道如何使用malloc(),我应该马上弄清楚整个数组的大小吗? malloc(X * (however many bytes a char takes) * 50)应该是二维数组。
  • “我需要在我的一个 CS 类中为一个程序创建一个字符串数组...” 现在有了给定的描述和你正在用 @987654327 做什么@ 不匹配。 malloc(X * (however many bytes a char takes) * 50) 没有给你一个可以容纳 strings 的数组。它只是给出了一个连续的序列来保存字符。
  • @Michael - 如果您使用的是 char **(这是最容易理解的),您将需要两次(某种)调用 malloc - 一个分配指针char ** 指向,然后一个(在循环中)分配char ** 数组中的每个 char *(这些是实际的 50 字符字符串)。 (你可以一次性完成,但理解如何让它发挥作用非常棘手,如果这是家庭作业,你的老师可能对你编写的让它发挥作用的代码不太满意。)
【解决方案3】:

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

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

别忘了释放内存!

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

您不会动态推送元素,是吗?如果是这样,我们将不得不变得更复杂一些。 (我会添加一个StringArray::capacity,以加快push,但我不想让事情变得过于复杂......如果你看看下面的cmets,看看我对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."); 

【讨论】:

  • a) 你在StringArray_Init() 中忘记了return a;。 b) 您不能通过单个 malloc 调用分配 char **。您可以通过一个 malloc 调用分配一个 char (*)[50],但 char **始终使用两个间接级别。
  • 这只是第三个作业。我不需要使用任何结构。
  • 另外,size_t len = 0;struct 中也不是有效的 C。(也许您在 C++ 领域中的时间太长了... (; )
  • @Chris 这就是为什么我更喜欢在可以提供帮助的情况下使用 C++ 工作的原因。 ;) 我希望它现在已修复?
  • @muntoo - 我个人更喜欢 C,但我不能怪你。 (现在你的推送函数中有一个松散的len 而不是a.len。)
猜你喜欢
  • 2016-03-25
  • 2013-05-31
  • 1970-01-01
  • 2013-12-14
  • 2022-01-17
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多