我在头文件中有以下内容。
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
引用的内存位置。
还有一件事... 我很确定你不应该为previous
和next
分配东西. 只需将它们设置为 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;
};