我需要为我的一个CS类中的程序创建一个字符串数组。我们假设所有字符串的长度不超过50(这说明了空字符)。
我需要使用malloc()
或calloc()
为数组分配适当的内存量,但我是C的新手,我真的不知道如何使用这些函数。
我想真正的问题是我需要为50个字符的x个字符串数组分配多少内存。
答案 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.");