C中链表中的空指针
Void pointers in a Linked List in C
我有一个程序,其功能是 returns 将 void * 转换为结构,但我认为在转换数据时我忽略了一些东西。
此函数创建一个包含字符串和整数的结构。从文件中读取字符串。
void * buildWord(FILE * fin)
{
void * ptr;
char buf[100];
Words * nw = (Words *)calloc(1, sizeof(Words));
fgets(buf, 100, fin);
strip(buf);
nw->word = (char *)calloc(1, (strlen(buf) + 1));
nw->length = strlen(buf);
strcpy(nw->word, buf);
ptr = &nw;
return ptr;
}
这是调用它并接受 void * 的函数。
Node * buildNode(FILE * in, void *(*buildData)(FILE * in) )
{
Node * nn = (Node *)calloc(1, sizeof(Node));
nn->data = (Words*)((*buildData)(in));
return nn;
}
这是节点的结构
struct node
{
void * data;
struct node * next;
};
typedef struct node Node;
我知道创建单词结构很好,但是当我去处理列表中的节点时,里面没有数据。我不确定为什么会这样。谢谢!
你需要做一些改变。
从buildData
返回的值不正确。而不是
ptr = &nw; // This is the address of nw. It will be
// a dangling pointer once the function returns.
return ptr;
你可以使用
return nw;
您可以从函数中删除 ptr
。
由于从 buildData
返回的值与您使用的指针不同,因此也需要更改对 buildData
返回值的使用。而不是
nn->data = (Words*)((*buildData)(in));
您需要使用:
nn->data = (Words*)buildData(in));
您的函数 buildword
声明了一个变量 ptr
,它在 fucntion.So 的范围内是局部的,当您 return 它释放了分配给该变量的内存时导致悬挂指针的上升。
所以不用
ptr = &nw;
return ptr;
做
return (void*)nw
;
我有一个程序,其功能是 returns 将 void * 转换为结构,但我认为在转换数据时我忽略了一些东西。
此函数创建一个包含字符串和整数的结构。从文件中读取字符串。
void * buildWord(FILE * fin)
{
void * ptr;
char buf[100];
Words * nw = (Words *)calloc(1, sizeof(Words));
fgets(buf, 100, fin);
strip(buf);
nw->word = (char *)calloc(1, (strlen(buf) + 1));
nw->length = strlen(buf);
strcpy(nw->word, buf);
ptr = &nw;
return ptr;
}
这是调用它并接受 void * 的函数。
Node * buildNode(FILE * in, void *(*buildData)(FILE * in) )
{
Node * nn = (Node *)calloc(1, sizeof(Node));
nn->data = (Words*)((*buildData)(in));
return nn;
}
这是节点的结构
struct node
{
void * data;
struct node * next;
};
typedef struct node Node;
我知道创建单词结构很好,但是当我去处理列表中的节点时,里面没有数据。我不确定为什么会这样。谢谢!
你需要做一些改变。
从
buildData
返回的值不正确。而不是ptr = &nw; // This is the address of nw. It will be // a dangling pointer once the function returns. return ptr;
你可以使用
return nw;
您可以从函数中删除
ptr
。由于从
buildData
返回的值与您使用的指针不同,因此也需要更改对buildData
返回值的使用。而不是nn->data = (Words*)((*buildData)(in));
您需要使用:
nn->data = (Words*)buildData(in));
您的函数 buildword
声明了一个变量 ptr
,它在 fucntion.So 的范围内是局部的,当您 return 它释放了分配给该变量的内存时导致悬挂指针的上升。
所以不用
ptr = &nw;
return ptr;
做
return (void*)nw
;