我有一个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,当打印元素数据时,会发生分段错误。注意:我无法更改参数或方法返回类型。
答案 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;
}