C语言 为什么我的 void 指针会更改程序中的值



我在头文件中有以下内容。

struct SortedList
{
    void * data;         
    struct SortedList * next;       
    struct SortedList * previous;
    int (*compareFunc)(void *, void *);
    void (*destructor)(void *);
};
typedef struct SortedList* SortedListPtr;
SortedListPtr SLCreate(CompareFuncT cf, DestructFuncT df);

在 .c 文件中,我实现了 SLCreate 函数。

SortedListPtr SLCreate(CompareFuncT cf, DestructFuncT df)
{
    struct SortedList item;         
    item.data = malloc(100);
    item.data = NULL;           
    item.next = (struct SortedList *) malloc(sizeof(struct SortedList));
    item.previous = (struct SortedList *) malloc(sizeof(struct SortedList));
    item.compareFunc = cf;
    item.destructor = df;
    SortedListPtr ptr = (struct SortedList *) malloc(sizeof(struct SortedList));    
    ptr = &item;
    return ptr;
};

在main.c中,我尝试执行以下操作: SortedListPtr list = SLCreate(&compareInts, &destroy);

//...... A bunch other code that does not alter list or it's contents at all. 

struct SortedList item = (*list);
void * data = item.data;
if (data != NULL)   
{
    printf("Why did data become not null???n");
}

那么,为什么数据不是空的,因为我在SLCreate函数中指示它?我以为我使用了malloc,我能做些什么来解决这个问题?

您返回的是局部变量的地址,这是 C 中未定义的行为。

如果要返回指针,则指针指向的内存必须位于返回它的函数的范围之外。 因为您要返回指向局部变量 item 的指针,所以当函数返回时,该内存位置不再可用。

我想你搞混了。 您确实分配了内存,但复制不正确。

SortedListPtr ptr = (struct SortedList *) malloc(sizeof(struct SortedList));    
ptr = &item;

在这里,您将指针替换为本地item的地址。 相反,最后一行应该是:

*ptr = item;

以上会将存储在item中的所有数据复制到ptr引用的内存位置。

还有一件事... 我很确定你不应该为previousnext分配东西. 只需将它们设置为 NULL . 如果不看到您打算如何使用它,我就无法确定,但我可以看到您对指针感到困惑。 这会更"正常":

item.next = NULL;
item.previous = NULL;

可能是这种方式可以减少复制。 因为我不确定您是否有复制结构器

SortedListPtr SLCreate(CompareFuncT cf, DestructFuncT df)
{
    SortedListPtr ptr = (struct SortedList *) malloc(sizeof(struct SortedList));    
    ptr->data = malloc(100);
    ptr->data = NULL;           
    ptr->next = (struct SortedList *) malloc(sizeof(struct SortedList));
    ptr->previous = (struct SortedList *) malloc(sizeof(struct SortedList));
    ptr->compareFunc = cf;
    ptr->destructor = df;
    return ptr;
};

相关内容

  • 没有找到相关文章