1

对于家庭作业,我需要定义一个将内存分配给字符串数组(位于结构中)的函数。

给定每个字符串的长度: 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*));

请给我解释...

4

3 回答 3

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变量保存实现整数的值一样,指针变量保存实现地址。

在几乎所有情况下,您都可以malloc()使用 sizeof() 运算符正确存储指针类型,并取消引用底层目标。在某些情况下,这不直观或不易于呈现,但以下内容应该有所帮助:

// 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];

正如我们上面已经讨论过的,这声明了一个类型的指针(pointer-to-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 个字符(包括零终止符),这将正常工作。

最后,别忘了在完成后释放您的分配:

free(dict);

剧透

myDict->dict0 =  malloc( myDict->len * sizeof(*(myDict->dict0)));
myDict->dict1 =  malloc( myDict->len * sizeof(*(myDict->dict1)));
于 2013-03-20T15:41:01.170 回答
0

在结构的声明中,

char (*dict0)[MAX_WORD_LEN+1];

表示这dict0MAX_WORD_LEN + 1 个元素pointer的字符数组,即.char [11]

要初始化对象的字段,您可以考虑如下所示的示例

void createDict(struct dict* myDict)
{
    myDict->dict0 = &glbarr;
    myDict->dict1 = &glbarr;
}

哪里glbarr是一个全局数组定义为

char glbarr[MAX_WORD_LEN+1];
于 2013-03-20T15:02:05.300 回答
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];

于 2013-03-20T15:04:33.073 回答