使用自定义函数初始化Struct?

时间:2014-01-20 04:11:55

标签: c struct

我有一个struct和一个构造函数方法。但是,我无法正确创建结构初始化。在参数中,我传递一个指向该结构类型的指针,以及它的所有实例变量(抱歉使用java术语,对C来说是新的)。 这是我的方法代码。

 typedef struct anagramElement anagramElement;
 struct anagramElement {
    char* word;
    char* key;
 };

void createAnagramElement(char* const word, char* const key, anagramElement* rv)
{
    rv = (anagramElement*) malloc(sizeof(anagramElement));
    rv->word = word;
    rv->key = key;

}

在main之后,传递anagramElement * ptr,char * Word,char * key,当打印元素数据时,会发生分段错误。注意:我无法更改参数或方法返回类型。

3 个答案:

答案 0 :(得分:5)

您按值传递rv。你做的任何事情都不会“超越”函数调用。为避免双指针,重构因此createAnagramElement()返回指针。

anagramElement* createAnagramElement(char* const word, char* const key)
{
    // don't cast the result of malloc()
    anagramElement* rv = malloc(sizeof(anagramElement));
    if (rv != NULL) {
        // Just storing pointers to strings (not copies) so you need to be
        // sure the strings don't go out of scope...
        rv->word = word;
        rv->key = key;
    }
    return rv;
}

如果您无法更改参数(每条评论),则createAnagramElement()可能会初始化已分配的anagramElement

void createAnagramElement(char* const word, char* const key, anagramElement* rv)
{
    // Don't change value of rv, just change values in the struct.
    // rv = (anagramElement*) malloc(sizeof(anagramElement));
    // Should also NULL check rv, but ignoring for now.
    rv->word = word;
    rv->key = key;
}

您可以这样称呼:

anagramElement    instance;
createAnagramElement("hello", "world", &instance);

答案 1 :(得分:0)

void createAnagramElement(char* const word, char* const key, anagramElement** prv)
{
    *rv = (anagramElement*) malloc(sizeof(anagramElement));

anagramElement* createAnagramElement(char* const word, char* const key)
{
    anagramElement *rv = (anagramElement*) malloc(sizeof(anagramElement));
    ...
    return rv;
}

答案 2 :(得分:0)

错误处理也是一个重要问题。使用双指针时,可以使用返回值作为结果状态,如失败或成功:

int createAnagramElement(char* const word, char* const key, anagramElement** element)
{
     *element= (anagramElement*) malloc(sizeof(anagramElement));

     if(*element == NULL){ return ANAGRAM_ELEMENT_FAILED; }

     //some operations

     return ANAGRAM_ELEMENT_SUCCESS;

}