我有一个结构
typedef struct HASH_NODE
{
char* word;
struct HASH_NODE* next;
} HASH_NODE;
和功能
void foo(char* destptr, const char* srcptr)
{
destptr = malloc(strlen(srcptr)+1);
strcpy(destptr, srcptr);
}
我想将结构字段.word传递给foo,我期望函数返回后我的字段值会改变,但它不会:
int main (void)
{
HASH_NODE* nodeptr = malloc(sizeof(HASH_NODE));
nodeptr->next = NULL;
nodeptr->word = NULL;
char* word = "cat";
foo(nodeptr->word, word);
}
我做错了什么?
答案 0 :(得分:4)
您正在通过malloc覆盖传递给destptr
的指针foo()
。将指针从main()
传递到foo()
:
void foo(char** destptr, const char* srcptr)
{
*destptr = malloc(strlen(srcptr)+1);
strcpy(*destptr, srcptr);
}
并致电:
foo(&nodeptr->word, word);
答案 1 :(得分:0)
在功能
中void foo(char* destptr, const char* srcptr)
{
destptr = malloc(strlen(srcptr)+1);
strcpy(destptr, srcptr);
}
参数destptr
和srcptr
是函数foo
的本地参数。它们是自动变量,即具有自动存储分配。这意味着它们在调用函数时被分配在堆栈上,并在函数返回时被销毁。将foo
称为
foo(nodeptr->word, word);
只需将nodeptr->word
的值复制到destptr
,将word
的值复制到scrptr
。因此,变量nodeptr->word
和word
不会更改。在desptr
函数中分配内存并分配给foo
会导致内存泄漏,因为该内存不可用,并且foo
返回时会丢失对它的处理。
您应该做的是将nodeptr->word
的地址传递给foo
并相应地更改foo
的签名。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct HASH_NODE
{
char *word;
struct HASH_NODE *next;
} HASH_NODE;
void foo(char **destptr, const char* srcptr)
{
*destptr = malloc(strlen(srcptr)+1);
strcpy(*destptr, srcptr);
}
int main (void)
{
HASH_NODE *nodeptr = malloc(sizeof *nodeptr);
if(nodeptr == NULL) {
printf("not enough memory to allocate\n");
return 1;
}
nodeptr->next = NULL;
nodeptr->word = NULL;
const char *word = "cat";
foo(&nodeptr->word, word);
// after done with nodeptr
free(nodeptr->next);
free(nodeptr);
//
return 0;
}