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

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

给出每个字符串的长度:MAX_WORD_LEN + 1(= 10 + 1)我必须为len个字符串分配内存, len在输入中接收。

具有字符串数组定义的struct(给定):

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

这是我写的,但我不确定它是否有效,而且我很难在编译器中检查它。 我也根据这个和其他网站的post写了它,并没有真正理解它:

选项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;ilen);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* (ie 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))); 

在结构的声明中,

 char (*dict0)[MAX_WORD_LEN+1]; 

表示dict0pointer 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]; 

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];char *dict[10];