C语言中字符串数组的动态分配



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

给出每个字符串的长度: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*));
请给我解释一下……

首先,您需要了解以下三种声明之间的区别。为简洁起见,假设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)));

在结构体声明中,

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

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];之间的区别。

相关内容

  • 没有找到相关文章

最新更新