关于 C++ 函数传入指针的问题(小白求教)

2019-07-04 11:22:11 +08:00
 Tony042
struct PolyNode
{
    int coef;
    int expon;
    PolyNode *Link;
};

typedef PolyNode *Polynomial;

struct PolyQueue
{
    Polynominal Front;
    Polynominal Rear;
};

typedef PolyQueue *PolyQueuePtrl;

void AddPolyNode(PolyQueuePtrl Ptrl, const int coef, const int expon)
{
    Polynominal Temp = new PolyNode;
    Temp->coef = coef;
    Temp->expon = expon;
    Temp->Link = nullptr;
    if (Ptrl->Front == nullptr)
        Ptrl->Front = Temp;
    if (Ptrl->Rear != nullptr)
        Ptrl->Rear->Link = Temp;
    Ptrl->Rear = Temp;
}

void Attach(Polynomial &rear, const int coef, const int expon)
{
    rear->Link = new PolyNode;
    rear = rear->Link;
    rear->coef = coef;
    rear->expon = expon;
    rear->Link = nullptr;
}

最近在学习数据结构,在用 C++实现一个队列的时候,有了一个疑问希望能获得各位大佬的解答。我写了两个函数来实现在队列末尾新增一个元素的操作。一个传入的是队列的指针,另外一个传入的是队列里面的 Rear 指针,定义和具体实现在上方代码中,在传入队列指针的时候直接传入即可实现插入的操作,但是在传入 Rear 指针的时候一定要传入 Rear 指针的引用才可以,同样是指针为什么一个传值就可以了,另一个要传引用呢?

3639 次点击
所在节点    C
34 条回复
b00tyhunt3r
2019-07-04 16:32:51 +08:00
nullptr 是什么?宏吗?
b00tyhunt3r
2019-07-04 16:37:52 +08:00
@b00tyhunt3r 饿 查了一下原来是 11 的新类型,请问这里为什么不直接用 NULL ?
jmc891205
2019-07-04 16:47:17 +08:00
@b00tyhunt3r
假设你有一个函数 void test_null(int ptr)

test_null(nullptr)会在编译的时候就报错
test_null(NULL)不会
b00tyhunt3r
2019-07-04 17:00:21 +08:00
@jmc891205 这个理解,NULL 相当于还是有个 0 值
但楼主这里用 nullptr 的意义是?
jmc891205
2019-07-04 17:08:50 +08:00
@b00tyhunt3r
意义是养成在所有地方都用 nullptr 抛弃 NULL 的好习惯
b00tyhunt3r
2019-07-04 18:17:07 +08:00
LZ,你的代码我原样复制在 mac+gcc4.2.1 上跑了一遍,
结果很奇怪,直接报了错 segmentation fault:11,

排查了一下发现是这句的问题:
Ptrl->Rear->Link = Temp;

具体来说把 “->Link ”注释掉就好了,应该是直接调用了 link 这个空指针。
你运行没问题吗?
也请大佬帮忙看一下谢谢
@jmc891205
@stackexplode
@zjsxwc
@srt180
jmc891205
2019-07-04 19:07:09 +08:00
@b00tyhunt3r 把你调用 lz 函数的代码贴出来
b00tyhunt3r
2019-07-04 19:30:59 +08:00
#include <iostream>
using namespace std;

struct poly
{
int coef;
int expon;
poly* link;
};
typedef poly* node;

struct polyqueue
{
node front;
node rear;
};
typedef polyqueue* polyq;

void addpoly(polyq q, const int coef, const int expon)
{
node tmp = new poly;
tmp->coef = coef;
tmp->expon = expon;
tmp->link = nullptr;
if(q->front == nullptr)
{q->front = tmp;}
if(q->rear != nullptr)
{q->rear->link = tmp;}
q->rear = tmp;
}

int main()
{
polyq x=new polyqueue;
addpoly(x,1,1);

return 0;
}


@jmc891205 是一样的啊
jmc891205
2019-07-04 20:22:28 +08:00
@b00tyhunt3r
类成员是指针的话 编译器自动生成的默认构造函数 不保证能正确地初始化他们为 nullptr
Tony042
2019-07-04 20:47:22 +08:00
@jmc891205 那为什么这个代码 https://paste.ubuntu.com/p/tD66H7V74M/运行没问题,但 @b00tyhunt3r 的就有问题呢,我在 windows 下用 clang 跑了一遍,遇到的也是相同的情况
Tony042
2019-07-04 20:50:06 +08:00
@b00tyhunt3r 楼里面的大佬说的应该是对的,我在初始化 PolyQueue 类型指针的时候,是调用了另一个函数显示初始化它们为 nullptr,但是我现在也不太明白为什么 https://paste.ubuntu.com/p/tD66H7V74M/这个代码运行起来没问题,而运行你的代码就会 stackfault
b00tyhunt3r
2019-07-04 21:40:45 +08:00
@Tony042 你的代码我看了, 和我的除了变量名不一样 其实是一模一样啊。
@jmc891205 的意思是说有一定几率不会成功将两个 link ( front 和 rear 的)初始化为 null 吗?

也就是说这么写是不安全的?那应该怎样改呢
谢谢回复!
jmc891205
2019-07-04 21:46:53 +08:00
@Tony042
没有初始化的指针可能是任何值,这个跟编译器的实现、运行程序的环境等等都有关系

@b00tyhunt3r
应该在 struct/class 的构造函数中显示地初始化每一个成员变量
jmc891205
2019-07-04 21:50:29 +08:00
@b00tyhunt3r
上面我的回复写了个错别字
应该在 struct/class 的构造函数中「显式」地初始化每一个成员变量

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/579913

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX