c - C 中字符串数组的动态分配

标签 c arrays string pointers malloc

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

给出每个字符串的长度: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/

相关文章:

C# 从带引号的字符串中删除分隔符

python - 字符串数组数据需要去掉美元符号并转换为 float

ruby-on-rails - 在 Rails 中,如何删除数组中的所有对象?

r - 为什么在强制转换为字符时列表中的日期首先转换为数字

c - 我们如何在 LLVM 中提取指针类型

在 C 中从 float 转换为 char[32](反之亦然)

C - 用低位宏显示字符串

c - 如何将 STRUCT 与 FIFO 结合使用

c++ - LLVM 中间表示 : fptoui vs. fptosi

c - 确定函数参数起始地址