返回指向结构的指针并访问其字段 C++
Posted
技术标签:
【中文标题】返回指向结构的指针并访问其字段 C++【英文标题】:Returning a pointer to a structure and accessing its fields C++ 【发布时间】:2013-05-11 09:45:12 【问题描述】:我正在为自己实现一个跳过列表,但在使用 C++ 时遇到了一些问题。 我有两个结构:
skiplist 的一个节点 - 它保存它的 int 值,以及一个指向指向其他节点的指针数组的指针。
struct node
int val;
node** next;
;
Skiplist 包含指向列表头部和尾部(哨兵)的指针。
struct skiplist
node *head, *tail;
;
另外,我有一个函数,它返回一个指向skiplist结构的指针(我使用这个函数来初始化skiplist):
skiplist* createSkipList()
skiplist* l = new skiplist;
node* listHead = new node;
node* listTail = new node;
node* headNext[MAX_LEVEL]; //array of pointers
listHead->next = headNext;
for(int i=0; i<MAX_LEVEL; i++)
listHead->next[i] = listTail;
l->head=listHead;
l->tail=listTail;
在我调用的 main() 函数中:
skiplist* skiplist=createSkipList();
在 createSkipList()
函数中一切正常,但如果我想引用 main() 中的跳过列表,即通过访问 skiplist->tail
,程序会崩溃。
我一直在寻找相关的帖子,但他们没有帮助我。
正如in a similar post 提到的,我不应该遇到悬空指针,因为我使用new
运算符来分配结构。
如果有任何提示,我将不胜感激;)
【问题讨论】:
你不是return l;
from createSkiplist()
。
打开编译器警告,停止浪费您和其他人的时间。编译器会告诉你缺少的返回值。
【参考方案1】:
第一个问题:
你没有从createSkipList()
返回任何东西,这意味着你的程序有未定义的行为。添加return
声明:
skiplist* createSkipList()
skiplist* l = new skiplist;
// ...
return l;
// ^^^^^^^^^
根据 C++11 标准的第 6.6.3/2 段:
[...] 从函数末尾流出相当于没有值的返回;这导致未定义 值返回函数中的行为。
第二个问题:
正如在类似帖子中提到的,我不应该遇到悬空指针,因为我正在使用 new 运算符来分配结构 [...]
不幸的是,您确实遇到了悬空指针。正如 Angew in the comments 所提到的,你在这里做什么:
node* headNext[MAX_LEVEL]; //array of pointers
listHead->next = headNext;
是创建一个本地数组对象,让listHead->next
指向它的第一个元素,而不考虑一旦createSkipList()
返回,数组(以及它包含的对象)将被销毁- 具有自动存储期限的对象在超出范围时会被销毁。
此外,作为一般建议,考虑使用智能指针来建模所有权,而不是通过原始指针、new
和 delete
进行手动内存管理。
【讨论】:
更不用说listHead->next
被设置为指向一个局部变量,一旦函数退出就会变成悬空的。
@Angew:正确,我在第一个问题上停了;)谢谢你提到它,我将它添加到答案中
@第一个问题我不够专心,在我的代码 sn-p 中省略了 return 语句。当然,您是对的,感谢您对此发表评论。 @第二个问题:我已经更改了创建数组的行,现在它工作正常。谢谢你们帮助我;)如果有人遇到类似的问题:node** headNext = new node*[MAX_LEVEL];
现在函数退出后数组不会丢失。以上是关于返回指向结构的指针并访问其字段 C++的主要内容,如果未能解决你的问题,请参考以下文章
C++指针问题,请问如何定义一个返回值为结构体指针数组的函数?