对于家庭工作,我需要定义一个将内存分配给字符串数组的函数(它是一个结构体)。
给出每个字符串的长度: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];
这是我写的,但我不确定它是否有效,而且我很难在编译器中检查它。我也是基于这个和其他网站的帖子写的,并不是真的理解它:
选项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*));
请向我解释......
答案 0 :(得分:7)
首先,您需要了解以下三个声明之间的区别。为简洁起见,假设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-chars的指针)。请注意,尚未分配实际内存。这只是一个指针;没有更多。因此,您可以使用以上语法安全地分配单个元素:
// 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-chars(包括零终结符),这将正常工作。
最后,完成后不要忘记释放你的分配:
free(dict);
<强>扰流强>
myDict->dict0 = malloc( myDict->len * sizeof(*(myDict->dict0)));
myDict->dict1 = malloc( myDict->len * sizeof(*(myDict->dict1)));
答案 1 :(得分:0)
在结构声明中,
char (*dict0)[MAX_WORD_LEN+1];
表示dict0
是 MAX_WORD_LEN + 1 元素(即pointer
)字符数组的char [11]
。
要初始化对象的字段,可以考虑示例,如下所示
void createDict(struct dict* myDict)
{
myDict->dict0 = &glbarr;
myDict->dict1 = &glbarr;
}
其中glbarr
是定义为
char glbarr[MAX_WORD_LEN+1];
答案 2 :(得分:0)
char (*dict)[MAX_WORD_LEN+1]
是指向char[MAX_WORD_LEN+1]
数组的指针。或者您可以将其解释为此类数组(二维数组)的数组。
让我们说吧
typedef char MyString[MAX_WORD_LEN+1];
。
然后您的声明将显示为MyString *dict0;
换句话说,dict0
可以是指向MyString
数组的第一个元素的指针。这就是你应该做的。
我不会发布详细的解决方案(你的老师不会对此感到满意)。
我建议您感受到char (*dict)[10];
和char *dict[10];
之间的区别。