struct string字段作为C中的函数参数

时间:2014-04-12 11:42:56

标签: c pointers struct function-parameter

我有一个结构

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);
}

我做错了什么?

2 个答案:

答案 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);
}

参数destptrsrcptr是函数foo的本地参数。它们是自动变量,即具有自动存储分配。这意味着它们在调用函数时被分配在堆栈上,并在函数返回时被销毁。将foo称为

foo(nodeptr->word, word);

只需将nodeptr->word的值复制到destptr,将word的值复制到scrptr。因此,变量nodeptr->wordword不会更改。在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;
}