对于家庭作业,我需要定义一个函数,将内存分配给字符串数组(在结构中)。
给出每个字符串的长度:MAX_WORD_LEN+1(=10+1)
我必须为 len
个字符串分配内存,在输入中收到 len
。
用字符串数组定义结构(给定):
struct dict{
int len;
char (*dict0)[MAX_WORD_LEN+1];
char (*dict1)[MAX_WORD_LEN+1];
};
我不明白声明 char (*dict0)[MAX_WORD_LEN+1];
- 同时给出函数声明:
void createDict(struct dict* myDict);
这是我写的,但我不确定它是否有效,而且我很难在编译器中检查它。我也是根据这个网站和其他网站的帖子写的,但不是很理解:
选项 1:
void createDict(struct dict* myDict)
{
myDict->(*dict0) = malloc( (myDict->len)*sizeof(char*));
myDict->(*dict1) = (char**) malloc( (myDict->len)*sizeof(char*));
for(int i=0;i<(myDict->len);i++)
{
(myDict->(*dict0)[i]) = (char*)malloc((MAX_WORD_LEN+1)*sizeof(char));
(myDict->(*dict0)[i]) = (char*)malloc((MAX_WORD_LEN+1)*sizeof(char));
}
}
选项 2:
(myDict->(*dict0)[MAX_WORD_LEN+1]) = malloc((myDict->len) * sizeof(char*));
(myDict->(*dict1)[MAX_WORD_LEN+1]) = malloc((myDict->len) * sizeof(char*));
请给我解释一下...
最佳答案
首先你需要了解以下三种声明的区别。为了简洁起见,假设 N
是 MAX_WORD_LEN+1 以匹配您的大小:
char data[N]; // array of N chars
char *data[N]; // array of N char *pointers* (i.e. char *)
char (*data)[N]; // pointer to array of N chars
首先要记住,指针是变量,它包含一个“地址”并且是实现定义的。就像 int
变量保存实现整数的值一样,指针变量保存实现地址。
在几乎所有情况下,您都可以使用 sizeof() 运算符为指针类型正确地 malloc()
内存,并解除对底层目标的引用。在某些情况下,这不直观或不易呈现,但以下内容应该有所帮助:
// allocates sizeof(Type) block
Type *p = malloc(sizeof(*p));
// allocates N*sizeof(Type) contiguous blocks
// note: we'll use this style later to answer your question
Type *pa = malloc(N * sizeof(*pa));
无论 Type
是什么,这都会起作用。这很重要,因为在您的情况下,您有一个指针声明为:
char (*dict)[N];
正如我们上面已经讨论过的,这声明了一个指针类型(指向 N 个字符的指针)。请注意,尚未分配任何实际内存。这只是一个指针;仅此而已。因此,您可以使用上述语法安全地分配单个元素:
// allocate single block
char (*dict)[N] = malloc(sizeof(*dict));
但这只占单个条目。您需要 len
条目,因此:
// allocate 'len' contiguous blocks each N chars in size
char (*dict)[N] = malloc(len * sizeof(*dict));
现在 dict
可以作为从 0..(len-1) 开始的数组安全寻址。您可以复制您的数据,例如:
strcpy(data[0], "test");
strcpy(data[1], "another test");
只要源字符串不超过 N 个字符(包括零终止符),这将正常工作。
最后,不要忘记在完成后释放您的分配:
free(dict);
剧透
myDict->dict0 = malloc( myDict->len * sizeof(*(myDict->dict0)));
myDict->dict1 = malloc( myDict->len * sizeof(*(myDict->dict1)));
关于c - C 中字符串数组的动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15526642/