【问题标题】:Allocate memory for a struct in a function为函数中的结构分配内存
【发布时间】:2015-03-10 17:57:35
【问题描述】:

我需要为学校的一个项目制作一台 adfgx 机器 (Code language from WWII)。但是我遇到了一些问题。

在 adfgx.h 中定义了一个结构和一些函数,如下所示:

typedef struct {
   char* alphabet;         
   char* symbols;          
   char* dictionary;       
   char* transposition;    
} adfgx;

在 adfgx.c 中,我们包含了标头,我必须编写一个函数,使用预定义的签名为这个结构分配内存:

/* Creates a new ADFGX machine */
adfgx* create_adfgx(const char* alphabet, const char* symbols, const char* dictionary, const char* transposition);

所以我在这里应该做的是为该函数中的结构分配内存。我不明白我应该怎么做,因为我现在不知道字母表、符号、字典和转置的大小,所以我现在要如何分配需要分配的内存?

【问题讨论】:

    标签: c memory struct


    【解决方案1】:

    我现在不知道字母、符号、字典和换位的大小

    由于没有传入大小,API 必须假定const char* 参数代表C 字符串。这样就可以通过调用strlen 来计算所需的大小,并将结果加一作为空终止符。

    为了避免多次做同样的事情,我建议定义你自己的字符串复制函数:

    static char *duplicate(const char *s) {
        if (s == NULL) return NULL;
        size_t len = strlen(s)+1;
        ... // Call malloc, check results, make a copy
        return res;
    }
    

    现在你可以使用这个函数来填充struct

    adfgx *res = malloc(sizeof(adfgx));
    if (res == NULL) ...
    res->alphabet = duplicate(alphabet);
    ...
    return res;
    

    【讨论】:

    • 有什么特别的理由建议您编写自己的 strdup() 变体而不提及您的建议吗?
    • @JonathanLeffler 这几乎可以肯定是一个学习练习,编写自己的strdup 版本可能是它的核心。如果教授希望他们使用strdup,OP 可能永远不会问这个问题:-)
    • 一种可能的解释,是的。这不是我想到的,但这远非不可能。另一种可能的解释是,为了方便起见,函数将其参数组合成一个结构。只要代码将使用该结构,指向的字符串就必须持续。然后所需要的就是将指针复制到分配的结构中。在这种情况下,根本不需要strdup()。尽管如此,平均而言,字符串必须重复的可能性更大,但我不确定strdup() 是否被禁止。我会提到它——这些 cmets 现在就足够了。
    【解决方案2】:

    adfgx 的大小不取决于“字母、符号、字典和转置的大小”——它是 4 个指针的大小。

    至于给newAdfgx->alphabet等成员赋值,可以使用strdup。当您释放adfgx 的实例时,请确保free() strduped 字符串。

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 2014-04-21
      • 2016-01-27
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      相关资源
      最近更新 更多